【问题标题】:How to 'install' and use in-house dependencies for other projects with CMake如何使用 CMake 为其他项目“安装”和使用内部依赖项
【发布时间】:2018-10-04 08:55:33
【问题描述】:

澄清:如果以下设置是一种合理的方法,那么我的问题主要是,当我运行 ninja install 时,如何最好地使用 .lib 添加公共头文件 因为我的解决方案目前不这样做。

有无数关于如何以不同方式做事的例子,其中许多似乎相互矛盾,让我更加困惑。

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

现在说到我无法理解在 CMake 中如何以现代智能方式实现它的部分。

忽略顶部需要依赖链工具这一事实,我的想法是按照库的顺序构建组件/库,而不依赖于最顶层的独立构建运行。 然后每个独立的构建运行将使用其依赖项构建,例如仅用于操作系统抽象库的 windows API,然后在其上运行安装和导出。

  • 这是将库编译为 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,但我不确定 build_interface 和 install_interface 生成器如何通过导出 .lib 文件来获取我的头文件。

【问题讨论】:

  • 这个问题有点宽泛。正如你所拥有的,你将能够构建并安装你的 OSAbstraction 到任何公共位置。您可以通过在调用 CMAKE 时在命令行上设置 CMAKE_INSTALL_PREFIX 变量来做到这一点。然后可以通过设置 CMAKE_PREFIX_PATH 引导其他脚本将此路径用作库/包含搜索路径。然后可以通过find_package() 找到您的预构建库。
  • 是的,我知道,问题在于,在我的无知中,似乎有很多方法可以完成这个目标,而且正如我所写的,许多答案似乎相互矛盾。上述解决方案也不适合我。同样,我不确定如何使用给定的示例尽可能正确地导出 .lib 及其标头。或者如果有更好的方法来做到这一点。如果这清除了一些?
  • 我认为这真的取决于你想要达到的目标。您是否希望构建一个多库、多平台的 SDK 以供您组织中的其他人使用,或者您是否希望简单地将一个 OSabstraction 库包含到您构建的每个其他可执行文件中?如果是前者,可能是构建 SDK 的 cmake 的 cmake。如果是后者,您可以将抽象作为可执行文件的 git 子模块,也可以使用 externalproject_add 将其构建到每个解决方案的构建目录中。
  • 我不知道这是否会回答您的问题,但我会这样做。为每个应该是库的“部分”创建一个 CMakeLists.txt。在该 txt 文件中,将标头公开给调用此 CMakeLists.txt 的任何项目。在您的主项目上,您只需要 add_library 每个子项目,它将构建并将其标题添加到构建系统。最终产品将是您的可执行文件。
  • 太宽泛,因为您在问题帖中有太多问题/问题。如果您只是想询问您向我们展示的项目的正确导出,那么只专注于该项目并显示您收到的错误消息。从我立即看到的情况来看,您忘记安装头文件、“abstraction-export”文件和“Config”文件本身(应该包括已安装的“abstraction-export”文件)。

标签: c++ cmake build-system


【解决方案1】:

推荐的解决方案是将包管理器与 CMake 一起使用。 下面的链接是一个完整的 C++ 项目设置模板,它可以使用包管理器https://conan.io/ 来支持将依赖项拆分为单独的库。

https://github.com/trondhe/cmake_template

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2015-07-14
    • 2014-05-05
    • 2012-10-07
    相关资源
    最近更新 更多