我想跨使用CMake編譯應用程序。當我對交叉編譯器的路徑進行硬編碼時,我有一切工作。但是,當我通過命令行參數傳遞路徑時,它似乎沒有正確跟蹤它們。CMake通過變量編譯器無法編譯一個簡單的程序
這裏是我的shell腳本,我從中克隆回購,應用補丁,然後嘗試cmake的構建:
cmake -D BASE=$PATH_TO_TOOLCHAIN_ROOT -D BOOST_ROOT=$BOOST_ROOT -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../${GIT_PATH}/src/
這裏是我的toolchain.cmake文件:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(PKG_CONFIG_EXECUTABLE "/usr/bin/pkg-config")
message("Base: ${BASE}")
message("Boost: ${BOOST_ROOT}")
set(CMAKE_SYSROOT "${BASE}/sysroot")
set(CMAKE_C_COMPILER "${BASE}/sysroot/usr/bin/mipsel-linux-gcc")
set(CMAKE_CXX_COMPILER "${BASE}/sysroot/usr/bin/mipsel-linux-g++")
set(CMAKE_FIND_ROOT_PATH "${BASE}/sysroot")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
include_directories(${CMAKE_SYSROOT}/usr/local/include/)
set(BOOST_INCLUDEDIR ${BOOST_ROOT}/include)
set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib)
include_directories(${BOOST_INCLUDEDIR})
set(OPENSSL_ROOT_DIR ${BASE}/sysroot/usr/lib/)
set(OPENSSL_SSL_LIBRARY libssl.so)
set(OPENSSL_CRYPTO_LIBRARY libcrypto.so)
同樣,如果我在這個工具鏈文件中將$ {BASE}硬編碼爲/ path/to/mipsel-linux-gcc,它就可以工作。
然而,當我真正把這個,我得到這個打印:
+ cmake -D BASE=/path/to/toolchain/root -D BOOST_ROOT=/home/matthew/boost/out -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../build/src/
Base: /path/to/toolchain/root
Boost: /home/matthew/boost/out
Base: /path/to/toolchain/root
Boost: /home/matthew/boost/out
-- The C compiler identification is GNU 4.7.3
-- The CXX compiler identification is GNU 4.7.3
-- Check for working C compiler: /path/to/toolchain/root/sysroot/usr/bin/mipsel-linux-gcc
Base:
Boost:
-- Check for working C compiler: /path/to/toolchain/root/sysroot/usr/bin/mipsel-linux-gcc -- broken
CMake Error at /usr/local/share/cmake-3.8/Modules/CMakeTestCCompiler.cmake:51 (message):
The C compiler
"/path/to/toolchain/root/sysroot/usr/bin/mipsel-linux-gcc"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: /home/matthew/Desktop/clones/build/CMakeFiles/CMakeTmp
在這裏你可以看到,它顯然確實找到編譯器,並確定他們既作爲GNU 4.7.3。但是,請注意打印輸出Base:/ path/to/toolchain/root。這個message()指令只在toolchain.cmake中列出一次,但它在這裏打印多次,最終顯示爲一個空白變量。之後,它抱怨說C編譯器不工作,儘管它顯然會打印出該編譯器的完整路徑。
我看到過其他人的類似問題,但是這看起來不同,因爲它在我將toolchain.cmake中的路徑硬編碼到C和CXX編譯器時工作正常。我已經嘗試過使用C和CXX編譯器指令的引號,以及沒有。
我也有興趣瞭解爲什麼我的信息指令打印出這麼多次!
感謝
'我也有興趣瞭解爲什麼我的消息指令會打印出很多次!' - 它似乎是在編譯器檢查期間第三次打印。這個檢查實際上是一個(單獨的)CMake項目,它「繼承」你的工具鏈......但不是傳遞給'cmake'的其他定義。看起來像使用CMake變量的參數化工具鏈不是一個好主意:這些變量不會傳遞給子項目。順便說一句,CMake有一個特殊的變量爲sysroot:[CMAKE_SYSROOT](https://cmake.org/cmake/help/v3.7/variable/CMAKE_SYSROOT.html)。 – Tsyvarev