Я не знаю об относительных путях, но вы можете использовать ${CMAKE_SOURCE_DIR}
, чтобы получить путь к каталогу верхнего уровня вашего проекта, где находится основной файл CMakeLists.txt.
From CMake docs для CMAKE_SOURCE_DIR
:
Путь к верхнему уровню исходного дерева.
Это полный путь к верхнему уровню текущее исходное дерево CMake. Для сборки в исходном коде это будет то же самое, что и CMAKE_BINARY_DIR.
Тогда вы можете просто основать все свои пути на этом. Например, в сценарии CMake вы можете написать ${CMAKE_SOURCE_DIR}/resources/datafile.txt
.
Edit:
Если вам нужен доступ к этому значению в самом коде C ++, вы можете используйте команду configure_file
. Например, вы можете создать файл с именем что-то вроде Config.h.in
...
// Config.h.in
#ifndef CONFIG_H
#define CONFIG_H
#define SOURCE_DIR "${CMAKE_SOURCE_DIR}"
#endif
... и затем в вашем файле CMakeLists.txt
configure_file(Config.h.in ${CMAKE_BINARY_DIR}/Config.h)
include_directories(${CMAKE_BINARY_DIR})
Затем вы можете включить Config.h
как обычный заголовок, и вы уже в пути!
Ярлык с одной переменной
Просто используйте макрос препроцессора. В CMakeLists.txt
в test/
:
target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")
в C ++:
std::string resource_dir = TEST_RESOURCE_DIR;