使用cmake add_definitions的文件路径

时间:2015-10-05 11:52:01

标签: cmake preprocessor add definition

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

#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是否仅支持整数值?

6 个答案:

答案 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)