问题标签 [cmake-language]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cmake - CMake - if() 命令如何处理符号?作为字符串还是变量?
我不确定 CMakeif()
命令会将条件子句中的符号视为变量还是字符串文字。所以我做了一些实验。
Script1.cmake
输出是:
所以我得出以下结论 1。
对于条件子句中的符号:
- 如果符号之前定义为变量,CMake 会将其视为变量并使用其值进行评估。
- 如果符号之前未定义为变量,CMake 会将其视为字符串。
然后我又做了一个实验。
输出是:
因此,尽管明确定义为变量,该ON
命令仍将其视为 TRUE 值的常量。这与我之前的结论 1直接矛盾。if
那么我如何确定 CMake if() 命令会将符号视为字符串还是变量?
2019 年 7 月 11 日上午 11:04 添加
似乎该if(constant)
形式先于其他形式的if()
陈述。(源)
如果常数为 1、ON、YES、TRUE、Y 或非零数字,则为真。如果常量为 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND、空字符串或以后缀 -NOTFOUND 结尾,则为 False。命名布尔常量不区分大小写。如果参数不是这些特定常量之一,则将其视为变量或字符串,并使用以下签名。
所以现在,在应用我的结论 1之前,我必须先参考上述规则。(这可能是一个答案,但我还不确定。)
cmake - 如何判断变量来自哪里?
我有一个目录CMakeLists.txt
。它调用module1.cmake
位于其他地方的 CMake 模块文件。
module1.cmake
将引用一个名为 的变量XXX
,该变量可能来自:
- 环境变量
%XXX%
。 - 命令行通过
cmake -D XXX=
XXX
在调用目录的CMakeLists.txt
through中定义set()
。- 以及之前配置的构建文件夹中的 CACHE 条目
然后module1.cmake
将变量存储XXX
到CACHE中。
在module1.cmake
文件中,我需要告诉XXX
来自哪里,因为我需要区别对待它们。
对于 1,我可以检查 的值$ENV{XXX}
。
对于 4,我正在考虑使用get_property(cached_XXX CACHE XXX PROPERTY VALUE)
并检查cached_XXX
. 但事实证明,该-D XXX=
选项总是更新 CACHE 条目。所以我无法判断该cached_XXX
值是来自旧 CACHE 还是来自当前-D
选项。
所以毕竟,我怎么能分辨2, 3 和 4?
cmake - 自定义命令不会在 cmake 中使用 --target 选项执行
此问题的后续问题:cmake 项目仅构建一个特定的可执行文件(及其依赖项)
我编写了一个自定义目标,因此每次我在项目中编译某些内容时它都会运行。现在我按照上面的问题调用了一个显式目标,这个自定义命令不再执行。代码:
我已经尝试删除该ALL
指令,但它没有改变任何东西。
忘了补充:我使用cmake/3.13.4
的是从源代码编译的。
c++ - cmake:安装外部提供的包含和库
我有一个非常简单的问题,我找不到解决方案:
我正在与一家公司合作,该公司偶尔会向我发送两个目录,一个带有 .h 文件,第二个带有两种形式的库,共享和静态。说 -
我想用一个执行这个简单操作的 cmake 项目来包装这个输入 - 创建一个我可以安装的 cmake 目标、别名、版本等。
cmake - 如何使用 cmake 生成 .out 文件?
我正在使用 CMake 为 ARM Cortex-M 进行交叉编译以配置项目。
到目前为止,我已经成功地设置了项目并且正在生成可执行文件。但是,要刷新电路板,我需要一个“.hex”。文件。
我已经按照 gcc 的 Nordic nRF5SDK 示例来获取有关编译和链接阶段的一些线索,并将它们传递给 CMake 例程。
但是,我无法生成任何“.out”文件来正确提取“.hex”文件。我玩过编译标志和链接器标志,但没有成功。
我已经在工具链文件和编译器中设置了初始化标志,十六进制是使用自定义命令生成的:
问题是我使用二进制文件来提取十六进制,而不是正确的“.out”文件。
如何在不使用与主构建并行的另一个自定义命令的情况下生成它?
PS:这里是项目的当前状态https://github.com/NunoRVicente/cmake-arm-toolchain
cmake - 如何在构建步骤中从对象名称中删除文件扩展名?
CMAKE_<LANG>_COMPILE_OBJECT
是设置编译规则的变量。
此变量设置在CMake<LANG>Information.cmake
. 源文件被构建并产生一个目标文件build/hello_world.o
。CMake 期望编译器生成不同的对象名称。
如何my
在构建步骤中从对象名称中删除源文件扩展名?
cmake - CMake:使用转义字符获取环境变量
假设想MY_VAR
在 CMake 中使用环境变量。这可以简单地通过使用来完成set(myVar $ENV{MY_VAR})
。
但是如果MY_VAR
包含转义字符MY_VAR="/path/with/escaped\ chars"
怎么办?CMake 将\
后跟空格视为两个单独的字符,而不是单个字符(空格)。换句话说,
打印/path/with/escaped\ chars
,不是/path/with/escaped chars
。如何让 CMake 识别环境变量中的转义字符?有没有关于这个问题的最佳实践?我在 macOS 上运行 CMake,但希望有一个独立于平台的解决方案......
上下文: Cmake 用于C++
在安装之前配置框架。MY_VAR
包含用户提供的路径,用于 (a) 在 Makefile 中设置和CMAKE_PREFIX_PATH
(b) 由 Cmake 到configure_file
框架所需的 python 脚本的配置文件。
c++ - 为什么每次我编辑任何副本时,我在不同文件夹中的所有 CMakelist.txt 文件都会被覆盖?
我有一个文件夹/home/ros/codes。在其中,我有按日期排列的文件夹,其中有一个 CMakeLists.txt 文件和一个构建文件夹,我在其中运行 cmake.. 和 make 命令。
最近,我观察到如果我从这组文件夹中的任何一个中编辑任何 CMakelists.txt 文件,编辑会自动覆盖在所有其他文件中。即使我已将另一个文件重命名为 -say- CMakelists(copy).txt ,这些更改仍然会得到反映。我可以看到这些是锁定的文件。所以我正在使用 sudo gedit 来编辑它们。
为什么会发生这种情况,我该如何进一步避免它?
c++ - 将从命令行翻译的库链接到 Make
我正在尝试运行英特尔数学内核库(mkl)。有一个工具 ( https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor ) 可以打印必要的、依赖于环境的 cmd 命令,以便将其用于 C++ 脚本。对我来说,它说:
使用此链接行: ${MKLROOT}/lib/libmkl_intel_lp64.a ${MKLROOT}/lib/libmkl_intel_thread.a ${MKLROOT}/lib/libmkl_core.a -liomp5 -lpthread -lm -ldl
编译器选项: -m64 -I${MKLROOT}/include
我的目标是在 CMake 脚本中编写它。我哪里错了/我必须写什么才能完成这项工作?
cmake - 在宏内使用带有 CMake 的 find_package 的 Qt4 出现问题
我在 CMake(版本 3.10)中定义了以下宏:
现在,当我尝试通过以下方式调用宏时,出现错误:
报告的错误是:
如果我find_package()
在宏内按以下方式调用,它可以工作!
但是我需要通过设置一个变量来使用它,如前所述。我该如何解决这个问题?