我需要获取某个东西安装位置的特定路径,然后使用该路径告诉程序在运行时在哪里搜索。 这在 Windows 上按预期工作,但在 Linux(特别是在 WSL2 中运行的 Ubuntu)上,发生了一些奇怪的事情。
在我的 CMake 中运行以下命令:
find_package(PROJ CONFIG REQUIRED)
find_path(PROJ_DATA_DIR
NAMES proj.db
PATHS "${PROJ_DIR}"
NO_DEFAULT_PATH
REQUIRED
)
add_compile_definitions(MY_PROJ_DIR=${PROJ_DATA_DIR})
message(${PROJ_DATA_DIR})
打印出:
/mnt/c/Users/cgnam/Source/Repos/vira/out/build/ubuntu/vcpkg_installed/x64-linux/share/proj
这就是我所期望的路径。 然而,在我的 C++ 代码中,当我使用以下命令检查定义的宏的值时:
#define STRINGIFY2(X) #X
#define STRINGIFY(X) STRINGIFY2(X)
...
std::cout << STRINGIFY(MY_PROJ_DIR);
打印出:
/mnt/c/Users/cgnam/Source/Repos/vira/out/build/ubuntu/vcpkg_installed/x64-1/share/proj
这几乎完全正确,除了
x64-linux
已被 x64-1
取代。
在 Windows 上构建时,这个确切的代码完全按照预期工作,所以我不知道为什么在 Ubuntu 上构建时它会这样做。 对我来说特别奇怪的是
linux
被整数 1 取代,但这也感觉是故意的,好像我遗漏了一些东西。
在 Linux 上,
linux
是预定义的宏:
$ cpp -dM /dev/null | grep linux
#define __linux 1
#define __gnu_linux__ 1
#define linux 1
#define __linux__ 1
所以,举个例子
#include <iostream>
#define MY_PROJ_DIR /mnt/c/Users/cgnam/Source/Repos/vira/out/build/ubuntu/vcpkg_installed/x64-linux/share/proj
#define STRINGIFY2(X) #X
#define STRINGIFY(X) STRINGIFY2(X)
int main()
{
std::cout << STRINGIFY(MY_PROJ_DIR);
}
打印
/mnt/c/Users/cgnam/Source/Repos/vira/out/build/ubuntu/vcpkg_installed/x64-1/share/proj
如果您改为执行
add_compile_definitions(MY_PROJ_DIR="${PROJ_DATA_DIR}")
,则不需要 STRINGIFY
宏,可以直接使用 MY_PROJ_DIR
。