Preciso obter um caminho específico de onde algo está instalado e, então, usar esse caminho para dizer a um programa onde procurar em tempo de execução. Isso está funcionando como esperado no Windows, mas no Linux (especificamente Ubuntu rodando em WSL2), algo estranho está acontecendo.
No meu CMake eu executo o seguinte:
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})
Isto imprime:
/mnt/c/Users/cgnam/Source/Repos/vira/out/build/ubuntu/vcpkg_installed/x64-linux/share/proj
que é o caminho que eu espero que seja. No meu código c++, no entanto, quando inspeciono o valor da macro definida usando:
#define STRINGIFY2(X) #X
#define STRINGIFY(X) STRINGIFY2(X)
...
std::cout << STRINGIFY(MY_PROJ_DIR);
ele imprime:
/mnt/c/Users/cgnam/Source/Repos/vira/out/build/ubuntu/vcpkg_installed/x64-1/share/proj
Isso está quase totalmente correto, exceto que o x64-linux
foi substituído por x64-1
.
Este código exato funciona completamente como esperado quando é construído no Windows, então não entendo por que ele está fazendo isso quando é construído no Ubuntu. É especialmente estranho para mim que linux
esteja sendo substituído pelo inteiro 1, mas isso também parece intencional, como se eu estivesse esquecendo de algo.
Por padrão, tanto para GCC quanto para Clang no Linux,
linux
há uma macro predefinida:Então, por exemplo
impressões
A parte "linux" do caminho é substituída por "1", pois esse é o valor da
linux
macro.Se você fizer isso
add_compile_definitions(MY_PROJ_DIR="${PROJ_DATA_DIR}")
, sua macro será definida como se fosseComo é uma string, o pré-processador não executará a substituição de macro.
Você também não precisará da
STRINGIFY
macro e poderá usá-laMY_PROJ_DIR
diretamente.NOTA: alguns sinalizadores do compilador suprimem o
linux
sinalizador. De acordo com a documentação do gcc :Por exemplo: