x64-linux在定义宏时就变成了x64-1?

问题描述 投票:0回答:1

我需要获取某个东西安装位置的特定路径,然后使用该路径告诉程序在运行时在哪里搜索。 这在 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 取代,但这也感觉是故意的,好像我遗漏了一些东西。

c++ cmake
1个回答
0
投票

在 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

© www.soinside.com 2019 - 2024. All rights reserved.