cmake add_definitions 的文件路径

File path with cmake add_definitions

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

#define MY_FILE_PATH "/usr/local/myfile"

在 cmake 中使用 add_definitions

add_definitions(-DMY_FILE_PATH=${MY_FILE_PATH})

在调用 cmake 时我使用 -DMY_FILE_PATH=/usr/tmp/myfile 但是会出现各种错误,例如,在“/”标记之前预期的主表达式和找不到 tmp 等。 在我的场景中可以使用 add_definitions 还是应该尝试 configure_file。 add_definitions 是否只支持整数值?

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

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

-DMY_FILE_PATH="/usr/tmp/myfile"

(您可能需要为您的 shell 正确转义它们)。

如果有人遇到同样的问题,我找到了合适的解决方案,这里需要引号 add_definitions(-DMY_FILE_PATH=$"{MY_FILE_PATH}") 这解决了这个问题。 在那之后 -DMY_FILE_PATH="/usr/tmp/myfile" 工作正常。

在 Windows 这对我有用:

set(INT_TESTDATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/testdata)
add_definitions(-DTESTDATA_DIR=R\"\(${INT_TESTDATA_DIR}\)\")

TESTDATA_DIR 则定义为:

#define TESTDATA_DIR R"(C:/aaa/bbbb/ccc/testdata)"

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

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

add_definitions( "-D_SOME_DEFINE=\"Some value with spaces, etc\"" "-D DEF1=\"Another string\"")

答案不仅限于路径,还适用于您希望作为预处理器指令提供的任何通用字符串。这是我能够提供包含 space 个字符的字符串的唯一方法。

add_definitions(-DMY_FILE_PATH=\"${MY_FILE_PATH}\") 

不要使用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}\"")

如果main.cpp包含:

#include <cstdio>

int main () { std::puts(MY_FILE_PATH); }

然后我们得到如下交互:

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

虽然总是首选使用目标属性,但如果您绝对使用目录属性,则替换add_definitions的函数是add_compile_definitions.你可以这样称呼它:

add_compile_definitions("MY_FILE_PATH=\"${MY_FILE_PATH}\"")