如何将CMake二进制路径传递给Linux上的C++?

k3fezbri  于 8个月前  发布在  Linux
关注(0)|答案(1)|浏览(69)

我的项目有这样一个简化的目录结构:

+-src
| +-CMakeLists.txt
+-example
| +-CMakeLists.txt
+-_builds
| +-win
| | +-src
| | +-example
| +-linux
| | +-src
| | +-example
+-CMakeLists.txt

字符串
example/CMakeLists.txt中,我使用依赖于平台的编译器将着色器编译到相应的_builds/*/example目录中,然后将路径传递给C++代码,如下所示:

target_compile_definitions(vulkan_tutorial PRIVATE EXAMPLE_BIN_DIR=${CMAKE_CURRENT_BINARY_DIR})


在C++中,我这样做:

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define GET_EXAMPLE_BIN_DIR() TOSTRING(MYLIB_EXAMPLE_BIN_DIR)

std::cout << GET_EXAMPLE_BIN_DIR() << std::endl;


在Windows上,这和我预期的一样,它打印D:/Dev/mylib/_builds/win/example
然而,在Ubuntu虚拟机上,它打印/mnt/hgfs/dev/mylib/_builds/1/example。所以Linux单词被替换为1。为什么会这样?如何解决?
我命名我的项目mylib只是为了这个问题。它的真实的名称是不同的,以防万一。它很简单,只包含几个核心ASCII字符,只有下划线字母。
我检查了二进制目录结构是否包含一个名为1的文件夹。它没有。它包含上面列出的内容。我搜索了类似的CMake变量,但没有找到任何解决方案。我还意识到,如果出现语法错误,CMake会显示整个命令。滥用这个,我检查了我的CMake build命令,发现它看起来不错。它包含以下内容:
-DEXAMPLE_BIN_DIR=/mnt/hgfs/dev/mylib/_builds/linux/example
整个命令行看起来像这样(我没有简化这个,不是为了隐藏任何可能的错误):
/bin/x86_64-linux-gnu-g++-9 -DMYLIB_ASSERT_TO_CERR -DMYLIB_ENABLE_EXCEPTIONS -DMYLIB_EXAMPLE_BIN_DIR=/mnt/hgfs/dev/mylib/_builds/linux/example -DMYLIB_LINKED_WITH_VULKAN -DMYLIB_LOGLEVEL=3 -DMYLIB_PRINT_CONFIG -I/mnt/hgfs/dev/mylib/include -I/mnt/hgfs/dev/mylib/third_party/glad2/include -I/mnt/hgfs/dev/mylib/_builds/linux/_deps/glfw-src/include -I/mnt/hgfs/dev/mylib/_builds/linux/_deps/glm-src -g -std=gnu++17 -MD -MT example/CMakeFiles/vulkan_tutorial.dir/vulkan.cpp.o -MF example/CMakeFiles/vulkan_tutorial.dir/vulkan.cpp.o.d -o example/CMakeFiles/vulkan_tutorial.dir/vulkan.cpp.o -c /mnt/hgfs/dev/mylib/example/vulkan.cpp

kyxcudwk

kyxcudwk1#

linux被定义为1MYLIB_EXAMPLE_BIN_DIR中的token在字符串化之前会被扩展。如果你想让一个宏成为字符串,只要把它作为字符串传递给编译器就可以了,然后你可以跳过字符串化,保证不会得到任何奇怪的扩展:

-DMYLIB_EXAMPLE_BIN_DIR=\"/mnt/hgfs/dev/mylib/_builds/linux/example\"

个字符
https://godbolt.org/z/ev4aq4eMx在cmake中执行此操作:

target_compile_definitions(vulkan_tutorial PRIVATE MYLIB_EXAMPLE_BIN_DIR="${CMAKE_CURRENT_BINARY_DIR}")


https://godbolt.org/z/515hx5bM1

相关问题