1

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

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

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

  • TopLevelApp.exe
    • 依赖关系_A
      • 依赖_A-1
      • 依赖_A-2
    • 依赖_B
      • 依赖_B-1
      • 依赖性_B-2

所以在这个例子中,TopLevelApp 将需要链接dependency_A、dependency_A-1、dependency_A-2 等,B 也是如此。我认为在目标应用程序中手动记住所有这些的责任是非常次优的。还有一个问题是确保所有目标都使用相同版本的依赖项(假设某些目标依赖于相同的东西,例如 boost)。

现在需要链接所有的库,并且没有办法绕过它。我正在寻找的是一个为你管理这个的构建系统。因此,您所要做的就是指定您依赖某些东西,并且该库的适当依赖项将自动被拉入。

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

4

1 回答 1

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 变量,以便递归地包含依赖项的依赖关系,但并非所有模块都正确执行此操作我上次检查。

于 2010-05-17T03:43:06.760 回答