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

标签 c++ cmake find package

我有以下文件结构,想使用一个 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.txttarget_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/

相关文章:

javascript - 使用 jquery find 更改节点

c++ - 内联和良好实践

visual-studio - Visual Studio 2022 CMake 预设

c++ - googlemock:模拟一个本地对象

CMake:如何使 add_custom_command 仅在输入更改时执行?

visual-studio-2010 - fatal error LNK1112 : module machine type 'x64' conflicts with target machine type 'X86' Visual studio 2010 and cmake

c++ - 为自定义类重载 std::find

linux - 检查运行控制脚本的所有者

c++ - C++ 中的内联成员函数

c++ - 检查类型是否是模板的实例化