我正在尝试更换硬编码预处理器
#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是否仅支持整数值?
答案 0 :(得分:3)
这里和Google上搜索的答案都不适合我(Windows上的CMake 3.4.1)。我终于找到了解决方案,所以你走了,希望这有助于某人:
诀窍是引用要添加add_definitions
的每个定义的全部内容,而不仅仅是它的值部分,并转义将转到shell的内部引号。请记住,每个定义应包含一个单独的字符串。像这样:
add_definitions( "-D_SOME_DEFINE=\"Some value with spaces, etc\"" "-D DEF1=\"Another string\"")
答案不仅仅限于路径,而是适用于您希望作为预处理程序指令提供的任何常规字符串。这是我能够提供包含空格字符的字符串的唯一方法。
答案 1 :(得分:1)
您的原始代码将宏定义为字符串文字,但您的CMake代码将其定义为一系列标记。换句话说,你删掉了引号。
在调用CMake时添加它们:
-DMY_FILE_PATH="/usr/tmp/myfile"
(您可能必须为shell正确地转义它们。)
答案 2 :(得分:0)
请勿使用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}\"")
答案 3 :(得分:-1)
如果有人遇到同样的问题,我找到了正确的解决方案,这里需要引号 add_definitions(-DMY_FILE_PATH = $ “{MY_FILE_PATH}”) 这解决了这个问题。 在那之后 -DMY_FILE_PATH = “/ USR / TMP / MYFILE” 工作正常。
答案 4 :(得分:-1)
在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)"
答案 5 :(得分:-1)
'select * from tbl1 where datetime1 >= "2020-11-15" and datetime1 <= "{0}"'.format(current_date)