CMake-DCMAKE_CXX_编译器可以工作,但SET(CMake_CXX_编译器…)被忽略?
在我的工具链文件中,我一直在尝试使用以下行将CPP编译器设置为CMake-DCMAKE_CXX_编译器可以工作,但SET(CMake_CXX_编译器…)被忽略?,cmake,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) 好吧,太夸张了,但这样我肯定CM
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不会从我传递的路径和命令结构中做出任何有趣的推断
我沿着这条路走下去,看了它在哪里谈论工具链文件
因此,仔细阅读一下,并决定从命令行执行此操作,因为命令行-D
将覆盖缓存的变量
这成功了
所以我的问题是,有人知道为什么我不使用-D
命令行选项时,CMake如何查找交叉编译器路径和exename,而忽略工具链中的集(CMake\U CXX\U编译器…
行
在每次构建之前,我都删除了build
目录和cmakache.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 .
文件cmakcrosscompile TryRunResult qnx armle.cmake
不包含cmake\u CXX\u编译器
任何关于giong的线索都将不胜感激
我还使用了-LA命令行选项来查看正在使用的缓存变量,当命令linne-D.
不存在时,它肯定无法从SET
命令中获得正确的值
编辑:我发现以下内容建议使用环境变量,find
似乎在这个过程中使用工具链文件中的变量可能太晚了?奇怪,因为它在上面链接的指南中显示了这种方法。有人能确认/否认这一点吗?谢谢。感谢所有回答的人。这两个答案实际上都没有涉及真正的原因,但都是非常好的尝试和非常相关的回答感谢你抽出时间来帮助我…非常感谢 问题与解决方案 我的问题最终归结为源代码构建中的问题…我现在已经了解了源代码构建的美丽和重要性!这确实是一个缓存问题。我认为我删除了所有必要的内容,但在源代码构建中发现,由于缓存,工具链文件没有被访问 因此,答案是使用源代码外构建。然后,您只需杀死二进制目录以模拟类似于
cmake clean
-的命令。然后,您就可以保证一切从头开始,并且不会缓存任何内容……耶
一些我发现有用的东西
查看缓存的变量
使用cmake
选项-LA
。这将列出cmake缓存中未标记为内部的缓存变量
使用-N
仅加载缓存,而不运行脚本
CMake等效于#误差
我发现工具链文件没有被重读,这对我来说是一针见血。为了解决这个问题,我在工具链文件中添加了以下行
MESSAGE(FATAL_ERROR "I am included")
你猜怎么着?没有发生错误。但是,一旦我清理了所有必要的废话,得到了一个干净的cmake
,错误就被触发了
平台CMake配置…自动包含
这件事让我迷惑了一段时间
发件人:
一旦系统和编译器由CMake
确定,它将加载
按以下顺序排列相应的文件:
Platform/${CMAKE\u SYSTEM\u NAME}.CMAKE
(必填)
我本来看到过这个,但是搜索了/Platform
。我应该搜索/Modfules/Platform
(也是这样?)
在我的工具链文件中,我有以下行
SET(CMAKE_SYSTEM_NAME QNX)
因此,CMake
正在搜索Platform/QNX.CMake
,正如交叉编译指南所说的那样。我没有意识到这意味着Modules/Platform/QNX.CMake
这里最有趣的一行,我认为这给了我一个问题,但最后没有(我仍然发现这个文件的自动包含和一些选项的来源等有趣的注意点。)
<代码>强制语言为C++,因为QNX只有GCC而不是G++和C++。
设置(CMAKE\u CXX\u COMPILE\u对象
“-x C++ +--C”
希望有人觉得这很有用:)所以你链接到的答案有一个链接到。它说: 如何使用不同的编译器? 方法3(避免):使用set() 使用Set()将适当的CMAKE_FOO_编译器变量设置为列表文件中的有效编译器名称或完整路径。这必须在设置任何语言之前完成(即在任何project()或enable_language()命令之前) 例如: 集合(CMAKE_C_编译器“gcc-4.2”)
设置(CMAKE_CXX_编译器“/usr/bin/g++-4.2”) 项目(“您的项目名称”)
您只需将其设置为
缓存
。用于:
我已经用一种方式做了,但是<必须在设置任何语言之前执行代码>操作。。。也许就是这样。。。但是,在设置语言后,可能会读取工具链文件。这是一个微妙的点,我没有看到。我完全按照建议做,但在工具链文件中。。。这可能是原因。把它推迟到明天,谢谢你的回答,稍后我们会继续看:)谢谢ruslo。今天早上我找到了解决办法。不幸的是,这不起作用,因为工具链文件甚至没有被读取。。。但你们的答案非常接近,这是一个非常好的主意,所以+1。谢谢:)
# 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>")
set(CMAKE_C_COMPILER gcc CACHE STRING "C compiler" FORCE)
set(CMAKE_CXX_COMPILER g++ CACHE STRING "C++ compiler" FORCE)