gpt4 book ai didi

c++ - 在 CMake 项目中解耦应用程序和库

转载 作者:行者123 更新时间:2023-11-30 02:29:00 24 4
gpt4 key购买 nike

我有一个配置为:

CMake 项目

  • static Lib A src (依赖于B)
    • 静态 Lib B src(取决于 Qt)
  • App src(与 LibA 静态链接)

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

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

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

这可能是一个糟糕的问题,因为我已经恢复正常了。我只是想确保我了解原因。

最佳答案

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

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

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

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

关于c++ - 在 CMake 项目中解耦应用程序和库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com