如何将我的项目分解为可以互相找到的CMake模块?

时间:2018-12-05 12:53:37

标签: c++ cmake

我有一个项目,其中包含非常模块化的组件(例如Dependency),

Project
-Dependency
--Include
--Src
--CMakeLists.txt
-Main
--main.cpp
--CMakeLists.txt
CMakeLists.txt

现在,我在主CMakeLists.txt中使用target_link_libraries()include_directories()并带有明确的相对路径来使用它们。

我想将我的依赖项转换为独立的软件包/模块/组件/库/ 一些东西,以便删除显式路径。

我不想安装它们。它们将保留在构建树中。我想例如在不破坏任何内容的情况下移动整个Dependency文件夹,或将文件夹复制到另一个项目中并使其仅通过find_package()调用即可工作。

-

我尝试过

target_include_directories(Dependency PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>)
target_link_libraries(Dependency PUBLIC *Sub-dependencies*)

export(TARGETS Dependency FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/DependencyConfig.cmake")

在Dependency CMakeLists.txt中,基于:

https://rix0r.nl/blog/2015/08/13/cmake-guide/https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/

但是find_package()仍然失败。

-

如何导出接口,以便CMake可以自动配置同一构建树中模块之间的依赖关系?

1 个答案:

答案 0 :(得分:1)

如果您有target_include_directories,则取决于PUBLIC / PRIVATE设置,该目标的从属目标也可以具有包含。

target_link_directories相同,它将库传播到相关目标。

您永远不需要库的路径,因为CMake 应该为您解决这个问题。如果没有,则可能是一个错误。