带有 cmake add_definitions 的文件路径

use*_*277 5 preprocessor add definition cmake

我正在尝试替换硬编码的预处理器

#define MY_FILE_PATH "/usr/local/myfile"
Run Code Online (Sandbox Code Playgroud)

在 cmake 中使用 add_definitions

add_definitions(-DMY_FILE_PATH=${MY_FILE_PATH})
Run Code Online (Sandbox Code Playgroud)

并且在调用 cmake 时,我使用-DMY_FILE_PATH=/usr/tmp/myfile 但得到所有类型的错误,例如,'/' 标记之前的预期主表达式和 tmp 未找到等。是否可以在我的场景中使用 add_definitions 或者我应该尝试 configure_file。add_definitions 是否仅支持整数值?

Ale*_*ing 8

不要使用add_definitions;从 CMake 3.12 开始,它已被弃用。target_compile_definitions代替使用。该代码可以追溯到 CMake 3.0。

cmake_minimum_required(VERSION 3.0)
project(example)

set(MY_FILE_PATH "/usr/local/myfile")

add_executable(main main.cpp)
target_compile_definitions(main PRIVATE "MY_FILE_PATH=\"${MY_FILE_PATH}\"")
Run Code Online (Sandbox Code Playgroud)

如果 main.cpp 包含:

#include <cstdio>

int main () { std::puts(MY_FILE_PATH); }
Run Code Online (Sandbox Code Playgroud)

然后我们得到如下交互:

dev@host:~/example$ cmake -S . -B build
...
-- Configuring done
-- Generating done
-- Build files have been written to: /home/dev/example/build
dev@host:~/example$ cmake --build build/
...
[100%] Built target main
dev@host:~/example$ ./build/main
/usr/local/myfile
Run Code Online (Sandbox Code Playgroud)

尽管始终首选使用目标属性,但如果您必须绝对使用目录属性,则替换的函数add_definitionsadd_compile_definitions. 你可以这样称呼它:

add_compile_definitions("MY_FILE_PATH=\"${MY_FILE_PATH}\"")
Run Code Online (Sandbox Code Playgroud)


Rom*_*lov 5

这里和谷歌搜索互联网的答案都没有对我有用(Windows 上的 CMake 3.4.1)。我终于找到了一个解决方案,所以你去吧,希望这对某人有所帮助:

诀窍是引用您要添加的每个定义的全部内容add_definitions,而不仅仅是它的值部分,并转义将进入 shell 的内部引号。请记住,每个定义都应包含一个单独的字符串。像这样:

add_definitions( "-D_SOME_DEFINE=\"Some value with spaces, etc\"" "-D DEF1=\"Another string\"")
Run Code Online (Sandbox Code Playgroud)

答案不仅限于路径,而且适用于您想要作为预处理器指令提供的任何一般字符串。这是我能够提供包含空格字符的字符串的唯一方法。


Rei*_*ica 0

您的原始代码将宏定义为字符串文字,但您的 CMake 代码将其定义为标记序列。换句话说,你去掉了引号。

调用 CMake 时将它们添加回来:

-DMY_FILE_PATH="/usr/tmp/myfile"
Run Code Online (Sandbox Code Playgroud)

(您可能必须为您的 shell 正确地转义它们)。