构建具有递归依赖聚合的系统

时间:2010-05-17 03:34:12

标签: c++ dependencies build-system premake

我最近开始使用跨平台构建系统建立自己的库和项目(按需生成make文件,visual studio解决方案/项目等),我遇到了可能已经解决的问题。

我遇到的问题是:当应用程序具有依赖项并且还具有依赖项时,链接的应用程序必须链接依赖项及其所有子依赖项。这以递归方式进行,例如

(为了论证,我们假设我们只处理静态库。)

  • TopLevelApp.exe
    • dependency_A
      • dependency_A-1
      • dependency_A-2
    • dependency_B
      • dependency_B-1
      • dependency_B-2

因此,在此示例中,TopLevelApp将需要链接dependency_A,dependency_A-1,dependency_A-2等以及B的相同内容。我认为在目标应用程序中手动记住所有这些内容的责任非常次优。还有一个问题是确保在所有目标中使用相同版本的依赖关系(假设某些目标依赖于相同的事物,例如提升)。

现在需要链接所有库,并且无法绕过它。我正在寻找的是一个为您管理这个的构建系统。因此,您所要做的就是指定您依赖某些内容,并自动引入该库的相应依赖项。

我一直在关注的构建系统是premake premake4,它不能处理这个问题(据我所知)。有谁知道一个构建系统确实处理这个?如果没有那么为什么不呢?

1 个答案:

答案 0 :(得分:1)

处理此问题的典型方法是让您依赖的库告诉您反过来需要的内容以及它所链接的版本。一种方法是通过pkg-config。例如,如果您调用pkg-config name_of_package --cflags,它将打印出必要的标志,其中应包含添加间接依赖项标头所需的标志。类似地,pkg-config name_of_package --ldflags将打印包含该特定库及其依赖项的必要链接器标志。至于构建系统,我的建议是使用CMake。在CMake中,通过调用FIND_PACKAGE(name_of_package)找到依赖关系,如果找到包,它又将变量name_of_package_FOUND定义为1,并且如果找到包,则定义name_of_package_LIBRARIES和name_of_package_INCLUDE_DIRS到库和头路径该包以及它的依赖项的库和头文件。也就是说,FIND_PACKAGE机制通过第三方编写的可插入模块工作,因此虽然系统应该设置_LIBRARIES和_INCLUDE_DIRS变量,以便递归地包含依赖关系的依赖关系,但并不是所有模块都在我检查后正确执行此操作。