2017-07-28 186 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) 

这将跳过编译器的测试,当然当你真正建立编译可能再失败后您的项目。