如何使用CMake为其他项目“安装”和使用内部依赖项

时间:2018-10-04 08:55:34

标签: c++ cmake build-system

说明:如果以下设置是一种可重新实现的方法,那么我的问题主要是,当我运行 ninja install时,如何最好地将公共头文件添加到.lib中? ,因为我的解决方案目前不这样做。

关于如何以不同方式做事的例子很多,许多似乎互相矛盾,使我更加困惑。

我正在尝试更换内部构建系统,并用CMake替换它。代码库由许多不同的组件/库组成,例如OS /平台抽象,网络,功能等。在始终将其编译为一个大代码库之前,因此运行clean会删除所有内容并重建所有依赖项。

现在涉及到我难以理解如何在CMake中实现现代智能方式的部分。

忽略了需要在顶层使用依赖链工具这一事实,我的想法是按照隔离库的运行顺序,以库的顺序构建组件/库,而对顶层没有依赖性。 然后,每个隔离的构建运行都将使用其依赖项(例如仅用于O​​S抽象库的Windows API)进行构建,然后在其上运行install和export。

  • 这是将库编译为Windows上的.lib或linux上的.a并将其导出到已知共享位置的一般首选方法吗?
  • 我猜是否需要将该库的所有公共头文件复制到同一位置?如果是这样,最正确的做法是什么?

如果我具有操作系统抽象文件夹结构

OSabstraction/
  includes/
    OSabstraction/
        abstraction.h
  src/
    abstraction.cpp
  CMakeLists.txt

我的CMakeLists是

cmake_minimum_required(VERSION 3.12)
project(OSabstraction LANGUAGES CXX)

add_library(abstraction)

target_sources(abstraction
    PRIVATE
        src/abstraction.cpp
)
target_include_directories(abstraction
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/>
    $<INSTALL_INTERFACE:include>
)

install(
    TARGETS abstraction
    EXPORT abstraction-export
    ARCHIVE DESTINATION lib
)

我如何最好在其他许多内部项目中使用该库?实际上,这个库要大很多倍,所以对于大型项目,正确的方法是什么?

编辑:我尝试遵循Pablo Arias' guide on how to do CMake Right,但对于通过.lib文件导出获取我的头文件,我不确定build_interface和install_interface生成器如何工作。

0 个答案:

没有答案