CMake Passed变量编译器无法编译简单程序

时间:2017-07-28 21:24:11

标签: c++ c linux git cmake

我正在尝试使用CMake交叉编译应用程序。当我硬编码交叉编译器的路径时,我已经完成了所有工作。但是,当我通过命令行参数传递路径时,似乎没有正确跟踪它们。

这是我的shell脚本,我从中修复了一个repo,应用了一个补丁,然后尝试了一个cmake build:

   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编译器指令的引号,以及没有。

我也有兴趣了解为什么我的消息指令会打印出这么多次!

由于

2 个答案:

答案 0 :(得分:1)

CMake正在进行测试构建,以确定编译器是否能够构建一个简单的应用程序(基本上只包含main())。这可能由于多种原因而失败,例如编译器不能使用默认的CMake检测标志等

您应该检查CMakeError.logCMakeOutput.log以查看测试编译失败的原因。

要跳过编译器测试,您可以将以下内容放到工具链文件中:

set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)

这将跳过编译器测试,但当然,当您实际构建项目时,编译可能会失败。

答案 1 :(得分:0)

在这里查看我的回复:

https://intellij-support.jetbrains.com/hc/en-us/community/posts/207460115/comments/360002077699

基本上,在进行系统自检期间,cmake将通过try_compile命令生成一些文件(测试C / CXX文件,Makefile甚至是新的CMake项目),然后默认将其删除。

如果您希望能够禁止删除这些生成的文件并调试问题,则可以在运行cmake的同时添加--debug_trycompile,并在root / cmake_build / CMakeFiles / CMakeTmp中找到一些非常有用的信息