cmake find_package CMakeLists.txt 子文件夹中的相对路径

cmake find_package relative path in CMakeLists.txt subfolder

本文关键字:文件夹 相对 路径 txt find package CMakeLists cmake      更新时间:2023-10-16

我有以下文件结构,并希望使用cmake配置文件MYLIBConfig.cmake,项目中所有CMakeLists.txt文件都使用该配置文件来包含位于顶层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"将标头包含在我的主文件中.cpp因为它们找不到。

问题是我不知道我对find_package的使用是否正确,因为当我在CMakeLists.txt中使用message(message(${MYLIB_INCLUDE_DIRS})时,设置变量MYLIB_INCLUDE_DIRS只是/include/。是否有我可以在MYLIBConfig.cmake文件中使用的 cmake 变量来设置相对于"当前活动"CMakeLists.txt的路径?或者有没有另一种方法可以使用配置文件实现工作包括?我知道我可以在每个CMakeLists.txttarget_include_directories内使用相对路径,但我想使用配置文件来灵活地更改包含文件夹并可能设置更多变量。在配置文件中,我还尝试使用 ${CMAKE_PREFIX_PATH} 和 ${CMAKE_CURRENT_SOURCE_DIR},但这些变量也不起作用。

编辑

我认为它可以起作用的另一种方式是当MYLIB_INCLUDE_DIRS将导致全球路径时。这是合适的方式吗?怎么能做到这一点呢?

您可以使用CMAKE_CURRENT_LIST_DIR获取MYLIBConfig.cmake全局路径:

set(MYLIB_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/include/)

或者,如果您想要当前处理的源的相对路径,您可以使用 file 相应地获取它:

file(RELATIVE_PATH MYLIB_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_LIST_DIR}/include/)