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}\"")
我正在尝试替换硬编码预处理器
#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}\"")