试图使用我的工具链文件中的以下行将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文件中的变量可能为时已晚?奇怪,因为它在上面链接的指南中显示了这个方法。可以确认/否认这个吗?感谢。
答案 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)
感谢所有回答的人。这两个答案都没有真正涵盖真正的原因,但都是非常好的尝试和非常相关的,所以感谢你节省时间来帮助我...非常感谢。
我遇到的问题最终归结为做源内构建......我现在已经了解了做源外构建的美观和重要性!这确实是一个缓存问题。我以为我正在删除所有必要的内容,但我在源代码内部发现的是因为缓存而没有访问工具链文件。
因此答案是使用外部来源 。然后你可以杀死二进制目录来模拟一个类似cmake clean
的命令。然后你可以保证一切从头开始,没有被缓存......耶!
使用cmake
选项-LA
。这将列出CMake缓存中未标记为内部的缓存变量。
使用-N
仅加载缓存而不运行脚本
它正在弄清楚工具链文件没有被重新阅读,这对我来说是个不错的选择。为了解决这个问题,我在工具链文件中添加了以下行...
MESSAGE(FATAL_ERROR "I am included")
猜猜是什么?没有发生错误。但是,一旦我清理了所有必要的guff以获得干净的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>")
希望有人觉得这很有用:)