CMake -DCMAKE_CXX_COMPILER有效但SET(CMAKE_CXX_COMPILER ...)被忽略了吗?

时间:2014-05-20 14:13:04

标签: cmake

试图使用我的工具链文件中的以下行将CPP编译器设置为g++

# specify the cross compiler
SET(CMAKE_CXX_COMPILER:FILEPATH /opt/qnx641/host/linux/x86/usr/bin/arm-unknown-nto-qnx6.4.0-g++)

这似乎没有被使用,所以我尝试了一些东西只是为了起诉

SET(CMAKE_C_COMPILER:FILEPATH   /junk/gcc)

好的,矫枉过正,但这样我肯定肯定CMake没有从我传入的路径和命令结构中做任何有趣的推论。

通过查看有关工具链文件的CMake Cross Compiling page,我走了这条路。

所以请仔细阅读并决定从命令行执行此操作,因为this QA thread显示命令行-D将覆盖缓存的变量。

这很有用!

所以我的问题是,有没有人知道为什么当我使用-D命令行选项时,CMake如何找到我的交叉编译器路径和exename但忽略了我工具链中的SET(CMAKE_CXX_COMPILER...行。

我在每次构建之前删除了build目录和CMakeCache.txt文件。

为了完整性,我正在使用的命令行是

rm CMakeCache.txt; 
rm -fr build; 
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=./build 
-DMAKE_TOOLCHAIN_FILE=/path/to/toolchain-file.cmake 
-C CMakeCrossCompile-TryRunResult-qnx-armle.cmake . 

文件CMakeCrossCompile-TryRunResult-qnx-armle.cmake不包含CMAKE_CXX_COMPILER

非常感谢giong的任何线索!

我还使用了-LA命令行选项来查看正在使用的缓存变量,当命令linne SET 不<时,它肯定没有从-D...命令获得正确的值/ em>现在......

编辑:我发现以下CMake Support Request建议使用环境变量,找到via this SO thread

似乎使用ToolChain文件中的变量可能为时已晚?奇怪,因为它在上面链接的指南中显示了这个方法。可以确认/否认这个吗?感谢。

3 个答案:

答案 0 :(得分:4)

您链接的SO答案包含指向CMake FAQ的链接。它说:

  

如何使用其他编译器?

     

...

     

方法3(避免):使用set()

     

使用set()将相应的CMAKE_FOO_COMPILER变量设置为列表文件中的有效编译器名称或完整路径。这必须在设置任何语言之前完成(即在任何project()或enable_language()命令之前)。

     

例如:

     

设置(CMAKE_C_COMPILER“gcc-4.2”)
  set(CMAKE_CXX_COMPILER“/ usr / bin / g ++ - 4.2”)

     

项目( “命名为yourprojectname”)

答案 1 :(得分:4)

您只需将其设置为CACHE即可。对于instance

set(CMAKE_C_COMPILER gcc CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER g++ CACHE STRING "C++ compiler" FORCE)

答案 2 :(得分:3)

感谢所有回答的人。这两个答案都没有真正涵盖真正的原因,但都是非常好的尝试和非常相关的,所以感谢你节省时间来帮助我...非常感谢。

问题&amp;溶液

我遇到的问题最终归结为做源内构建......我现在已经了解了做源外构建的美观和重要性!这确实是一个缓存问题。我以为我正在删除所有必要的内容,但我在源代码内部发现的是因为缓存而没有访问工具链文件。

因此答案是使用外部来源 。然后你可以杀死二进制目录来模拟一个类似cmake clean的命令。然后你可以保证一切从头开始,没有被缓存......耶!

我发现一些有用的东西

查看缓存变量

使用cmake选项-LA。这将列出CMake缓存中未标记为内部的缓存变量。

使用-N仅加载缓存而不运行脚本

CMake相当于#error

它正在弄清楚工具链文件没有被重新阅读,这对我来说是个不错的选择。为了解决这个问题,我在工具链文件中添加了以下行...

MESSAGE(FATAL_ERROR "I am included")

猜猜是什么?没有发生错误。但是,一旦我清理了所有必要的guff以获得干净的cmake,就会触发错误。

平台CMake配置...自动包含

这个曾经困扰过我一段时间......

来自http://www.cmake.org/Wiki/CMake_Cross_Compiling

  

一旦系统和编译器由CMake确定,它就会加载   相应的文件按以下顺序排列:   Platform/${CMAKE_SYSTEM_NAME}.cmake(强制性)

我最初看过这个,但搜索过<CMakeList.txt directory>/Platform。我应该搜索<CMakeList.txt directory>/Modfules/Platform(以及?)

在我的工具链文件中,我有以下行...

SET(CMAKE_SYSTEM_NAME QNX)

因此,CMake正在搜索Platform/QNX.cmake,正如交叉编译指南所说的那样。我没有意识到的是这意味着Modules/Platform/QNX.cmake

这里最有趣的一行,我认为这给了我一个问题,但最终还是没有(我仍然发现这个文件的自动包含和有趣的注意事项,其中一些选项来自等等... )

# force the language to be c++ since qnx only has gcc and not g++ and c++?     
set(CMAKE_CXX_COMPILE_OBJECT 
    "<CMAKE_CXX_COMPILER> -x c++ <DEFINES> <FLAGS> -o <OBJECT> -c <SOURCE>")

希望有人觉得这很有用:)