【问题标题】:CMAKE: automatically add dependencies of dependenciesCMAKE:自动添加依赖的依赖
【发布时间】:2016-04-15 14:19:02
【问题描述】:

我正在尝试将 boost-build 构建系统迁移到 cmake。

boost-build 的功能之一是自动链接依赖项的依赖关系。

例如:

增强构建:

我正在构建一个可执行文件app。这取决于lib2

exe app
:   [ glob *.cpp ]
    /proj/lib2//lib2
;

反过来,lib2 依赖于lib1

lib lib2
:   [ glob *.cpp ]
    /proj/lib1//lib1
;

并且lib1 没有依赖关系

lib lib1
:    [ glob *.cpp ]
;

lib1 和 lib2 都是静态库。

boost-build 会自动将lib1.a 添加到app 的链接器行,因为它知道lib2.a 依赖于lib1.a

cmake:

明确在 target_link_libraries 指令中同时声明 lib1 和 lib2 有效:

lib1:

add_library(lib1 STATIC ${SOURCES})

lib2:

add_library(lib2 STATIC ${SOURCES})

应用程序:

add_executable(app ${SOURCES})
target_link_libraries(app lib1 lib2)

随着图书馆数量的增加,这变得很麻烦。

target_link_libraries(app lib1 lib2 lib3 lib4 lib5 lib6 lib7 lib8 lib9 ... libN)

问题:

  • 有没有办法指定lib2 依赖于lib1
  • 有没有办法告诉app 拉入lib2 以及lib2 所依赖的任何东西?

【问题讨论】:

标签: c++ cmake boost-build


【解决方案1】:

就像将target_link_libraries 添加到lib2 一样简单

lib1:

add_library(lib1 STATIC ${SOURCES})

lib2:

add_library(lib2 STATIC ${SOURCES})
target_link_libraries(lib2 lib1)

应用程序:

add_executable(app ${SOURCES})
target_link_libraries(app lib2)

【讨论】:

  • 请注意,这种方法还使您免于使用某些链接器工具链的顺序依赖问题。例如,gcc 的链接器对此非常挑剔,如果您没有正确排序静态库扁平列表中的参数,它将拒绝链接。通过像这里这样对库依赖项进行建模,CMake 能够为您解决所有这些问题。
猜你喜欢
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多