【问题标题】:decoupling app and libraries in CMake project在 CMake 项目中解耦应用程序和库
【发布时间】:2016-10-17 22:27:09
【问题描述】:

我有一个项目被配置为:

CMake 项目

  • 静态库 A src(取决于 B)
    • 静态库 B src(取决于 Qt)
  • App src(与 LibA 静态链接)

每个文件夹都有自己的 CMakeLists.txt,但都是同一个 CMake 项目的一部分。一切正常。

然后为了更方便的将库源和app源分离到不同的源代码库,我开始学习CMake包的创建和在LibA上执行find_package。我重新安排了一些事情,现在这些库是他们自己的 CMake 项目,这需要我运行“cmake --build .--target install”来将包放在一个公共区域(而不是在构建文件夹中)。

该应用程序同样成为了自己的 CMake 包,我认为我只需要 find_package(LibA)。事实证明,我还需要在 LibB 上找到_package,因为应用程序需要一个标头。但出乎意料的是,App 需要像 LibB 一样在 Qt5Widgets、Qt5Core 和 Qt5Gui 上查找包。这是我不太明白的部分。当一切都是一个巨大的项目时,应用程序的 CMakeLists.txt 只需要链接到 LibA。所有其他的东西都是在我不知情的情况下处理好的吗?我是否天真地认为在 LibA 和 LibB 上执行 find_package 会以某种方式导致 Qt 库也链接到应用程序?

这可能是一个糟糕的问题,因为我的事情又开始了。我只是想确保我理解其中的原因。

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    在 C++ 中使用静态库不会引入它们的依赖项,因此必须在链接可执行文件时明确指定它们(与动态库相比)。

    static library 本质上是一个预编译的函数存档(一个目标文件),它通过 C++ 链接器以与任何其他目标文件类似的方式链接到您的应用程序中。因此,它不包含有关其依赖项的信息。

    shared (dynamic) library 是一个更复杂(和通用)的东西,允许加载和链接代码运行时。这是由dynamic linker 完成的,它还将递归地为其加载加载的库的任何依赖项。

    因此,如果您想避免显式指定依赖项,动态库可能是更好的选择(出于各种其他原因,它也可能是更好的选择 :))。

    【讨论】:

    • 感谢您的解释。在我看来,在一个单体项目中静态链接时,CMake 让事情变得比其他方式更容易,这在我分离成两个项目时造成了混乱。这不一定是坏事,我只需要知道它代表我这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2013-05-12
    • 2013-04-28
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多