我有以下文件结构,想使用一个 cmake 配置文件 MYLIBConfig.cmake
,项目中的所有 CMakeLists.txt
文件都使用它来包含 header 位于顶层的文件夹 include
中。
MYLIBConfig.cmake
include/
header_a.h
header_b.h
src/
project_a/
CMakeLists.txt
main.cpp
project_b/
CMakeLists.txt
main.cpp
CMakeLists.txt
包含以下内容:
cmake_minimum_required(VERSION 3.14)
find_package(MYLIB REQUIRED PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../../)
project(projecta)
set(CMAKE_CXX_STANDARD 17)
add_executable(projecta main.cpp)
message(${MYLIB_INCLUDE_DIRS}) # Outpus /include/ which is the problem. Should be a relative path to the include folder
target_include_directories(${PROJECT_NAME}
PRIVATE
${MYLIB_INCLUDE_DIRS}
)
MYLIBConfig.cmake 目前有以下内容:
cmake_minimum_required(VERSION 3.14)
#message(${PREFIX})
set(MYLIB_INCLUDE_DIRS ${CMAKE_PREFIX_PATH}/include/)
使用此设置,我无法使用 #include "header_a.h"
将 header 包含在我的 main.cpp 文件中,因为找不到它们。
问题是我不知道我对 find_package
的使用是否正确,因为设置变量 MYLIB_INCLUDE_DIRS
只是 /include/
当我在 CMakeLists.txt
中使用 message(message(${MYLIB_INCLUDE_DIRS})
时。是否有我可以在 MYLIBConfig.cmake< 中使用的 cmake 变量
文件设置相对于“当前事件”CMakeLists.txt
的路径?还是有另一种方法可以使用配置文件实现工作包含?我知道我可以使用每个 CMakeLists.txt
的 target_include_directories
内的相对路径,但我想使用配置文件来灵活地更改包含文件夹并可能设置更多变量。在我还尝试使用 ${CMAKE_PREFIX_PATH} 和 ${CMAKE_CURRENT_SOURCE_DIR} 配置文件,但这些变量也不起作用。
编辑
我认为它可以工作的另一种方式是 MYLIB_INCLUDE_DIRS
会导致全局路径。这是合适的方法吗?如何做到这一点?
最佳答案
您可以在 MYLIBConfig.cmake
中使用 CMAKE_CURRENT_LIST_DIR 获取全局路径:
set(MYLIB_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/include/)
或者如果你想要一个到 currently processed source 的相对路径你可以用 file 得到它:
file(RELATIVE_PATH MYLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_LIST_DIR}/include/)
关于c++ - CMakeLists.txt 子文件夹中的 cmake find_package 相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57402549/