2017-07-28 71 views
0

我想跨使用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編譯器指令的引號,以及沒有。

我也有興趣瞭解爲什麼我的信息指令打印出這麼多次!

感謝

+0

'我也有興趣瞭解爲什麼我的消息指令會打印出很多次!' - 它似乎是在編譯器檢查期間第三次打印。這個檢查實際上是一個(單獨的)CMake項目,它「繼承」你的工具鏈......但不是傳遞給'cmake'的其他定義。看起來像使用CMake變量的參數化工具鏈不是一個好主意:這些變量不會傳遞給子項目。順便說一句,CMake有一個特殊的變量爲sysroot:[CMAKE_SYSROOT](https://cmake.org/cmake/help/v3.7/variable/CMAKE_SYSROOT.html)。 – Tsyvarev

回答

1

CMake的是做一個測試版本,以找出是否編譯器能夠構建一個簡單的應用程序(基本上只含main())。這可能由於多種原因而失敗,例如,編譯器不能使用默認的CMake檢測標誌等。

您應該檢查CMakeError.logCMakeOutput.log以瞭解測試編譯失敗的原因。

要跳過編譯器的測試,你還不如把下面的工具鏈文件:

set(CMAKE_C_COMPILER_WORKS 1) 
set(CMAKE_CXX_COMPILER_WORKS 1) 

這將跳過編譯器的測試,當然當你真正建立編譯可能再失敗後您的項目。