CMake-DCMAKE_CXX_编译器可以工作,但SET(CMake_CXX_编译器…)被忽略?

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

在我的工具链文件中,我一直在尝试使用以下行将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不会从我传递的路径和命令结构中做出任何有趣的推断

我沿着这条路走下去,看了它在哪里谈论工具链文件

因此,仔细阅读一下,并决定从命令行执行此操作,因为命令行
-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)