我正在尝试替换硬编码的预处理器。
#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只支持整数值吗?
发布于 2015-10-05 11:57:55
原始代码将宏定义为字符串文本,但CMake代码将其定义为一系列标记。更确切地说,你把引号掉了。
在调用CMake时将它们添加回:
-DMY_FILE_PATH="/usr/tmp/myfile"(您可能必须正确地将它们转义到shell中)。
发布于 2016-08-01 16:56:14
这里和谷歌搜索互联网的答案对我都没有用(Windows上的CMake 3.4.1 )。我终于找到了解决办法,希望这能帮上忙:
诀窍是引用您想要用add_definitions添加的每个定义的全部内容,而不仅仅是它的值部分,并转义到shell的内部引号。请记住,每个定义应该包含一个单独的字符串。如下所示:
add_definitions( "-D_SOME_DEFINE=\"Some value with spaces, etc\"" "-D DEF1=\"Another string\"")答案不仅限于路径,而且适用于您希望作为预处理器指令提供的任何通用字符串。这是我能够提供包含空格字符的字符串的唯一方法。
发布于 2020-12-07 07:46:02
不要使用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}\"")https://stackoverflow.com/questions/32947974
复制相似问题