在CMake项目中解耦app和库

时间:2016-10-17 22:27:09

标签: c++ cmake

我有一个配置为的项目:

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"将包放在公共区域(不在构建文件夹中)。

该应用程序同样成为了自己的CMake包,我想到我只需要find_package(LibA)。原来我还需要libB上的find_package,因为App需要一个头。但意想不到的部分是应用程序需要在Qt5Widgets,Qt5Core和Qt5Gui上find_package,就像LibB一样。这是我不太了解的部分。当一切都是一个巨大的项目时,App的CMakeLists.txt只需要与LibA联系。在我不知情的情况下,所有其他的事情都得到了解决吗?我是否天真地认为在LibA和LibB上执行find_package会以某种方式导致Qt库链接到应用程序中?

这可能是一个糟糕的问题,因为我有事情再次发挥作用。我只想确保理解原因。

1 个答案:

答案 0 :(得分:3)

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

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

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

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