【问题标题】:Pass output of command line utility to compiler/linker将命令行实用程序的输出传递给编译器/链接器
【发布时间】:2015-12-30 06:37:31
【问题描述】:

我想在自定义分配器声明中将getconf PAGESIZE 命令输出的结果作为预处理器定义以-DPAGESIZE=`getconf PAGESIZE` 的形式传递给我的程序,用于[[gnu::assume_aligned(PAGESIZE)]]

我尝试了以下方法:

add_definitions(-DPAGESIZE=`getconf PAGESIZE`)

但它的扩展与-DPAGESIZE="\`getconf" ... PAGESIZE` 完全相同,其中... 是其他CMAKE_CXX_FLAGS* 的内容。 IE。 CMakeLists.txt 文件中的反引号转义存在问题。

如何正确地将此类参数传递给CMakeLists.txt 文件中的编译器/链接器?也许还有其他方法可以实现期望?

我也试过add_definitions(-DPAGESIZE="$$(getconf PAGESIZE)")$$ 扩展为$ by cmake),但-DPAGESIZE 和其余部分被cmake 拆分。 add_definitions("-DPAGESIZE=$$(getconf PAGESIZE)") 使 cmake 逃脱每个美元符号。

【问题讨论】:

  • 这里的答案可能有用:stackoverflow.com/a/1468695/3171657
  • @usr1234567 反引号在 Bourne shell 上下文中有意义。它使 shell 运行用反引号括起来的命令,然后用它代替整个“反引号”表达式。
  • @Orient:我知道,但我怀疑这是否适用于 CMake。你可以看到反引号被转义了。所以你必须验证它是否有效。
  • 终于用set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPAGESIZE=\"`getconf PAGESIZE`\"")解决了。似乎在add_definitions()set() 的上下文中转义不同。

标签: c++ cmake compiler-flags


【解决方案1】:

根据add_definitions 命令的文档,传递给此命令的预处理器定义附加到COMPILE_DEFINITIONS 属性:

以 -D 或 /D 开头的看起来像预处理器定义的标志会自动添加到当前目录的 COMPILE_DEFINITIONS 目录属性中。

并且COMPILE_DEFINITIONS属性的内容,根据其documentation总是被CMake转义,所以你不能在构建命令中保留反引号的特殊含义:

CMake 将自动为原生构建系统正确转义该值

您可以手动修改 CMAKE_CXX_FLAGS,如您在评论中显示的那样。

更好的方法是使用execute_process 命令在配置 阶段运行需要的命令,并将其输出用于add_definitions 命令。 (或使用此输出创建带有configure_file 的附加头文件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2023-04-08
    • 2016-07-12
    • 2019-08-08
    • 2015-10-13
    相关资源
    最近更新 更多