【问题标题】:Interdependancy of C++ libraries with CMakeC++ 库与 CMake 的相互依赖关系
【发布时间】:2016-05-31 11:14:03
【问题描述】:

在这样一个远离的地方处理 CMake 文件以及如何处理不需要处理依赖顺序? (请参阅我之前与问题相关的问题Strange error: undefined reference to `class::class()')。

例如,如果您的 lib A 依赖于 lib B,而后者又依赖于 lib C,那么您将编写代码

add_library({MY_LIB} A B C)

如何不被强制执行?在不久的过去,我只是这样做了

target_link_libraries({MY_LIB} {MY_LIB})

但这对我来说不再有用了....我不知道为什么(???)。这个问题很烦人,因为我有大量相互依赖的库...

请有任何建议(我在 Ubuntu 4.8.4-2ubuntu1~14.04.3 上使用 cmake 3.5.2,gcc 版本 4.8.4)?

【问题讨论】:

  • 能否包含 target_link_libraries({MY_LIB} {MY_LIB}) 失败的 CMakeLists.txt?

标签: c++ compilation linker cmake


【解决方案1】:

一个add_library命令创建每个库,然后用target_link_libraries设置依赖就足够了。

在你的情况下,你会有例如

add_library(A ${sources_for_A})
add_library(B ${sources_for_B})
add_library(C ${sources_for_C})

target_link_libraries(A B)  # A depends on B
target_link_libraries(B C)  # B depends on C

# Executable using the libraries
add_executable(program ${sources_for_program})
target_link_libraries(program A)  # Program uses library A (and B and C indirectly)

库是STATIC 还是SHARED 无关紧要。

【讨论】:

  • target_link_library 还是 target_link_libraries?请问有什么区别?
  • 收到此错误消息Unknown CMake command "target_link_library"
  • @polar target_link_libraries。并且您需要告诉 CMake 您拥有的依赖项,否则它可能会在库 C 之前构建库 B,并且对于无法工作的共享库。如果您只有静态库,并且顺序无关紧要(并且没有项目的某些部分依赖的自动生成的文件),那么您可以跳过该顺序,并为 program 目标添加所有库。跨度>
  • 但是在不久的过去,我可以通过复制库来链接库,而不管它们的顺序如何;例如target_ling_libraries(program {MY_LIB} {MY_LIB}.... {MY_LIB})。我不明白为什么我现在才需要处理订单……很奇怪
  • @polar 真惊喜,你得到了again the same answer。 :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2011-06-26
  • 2021-09-13
  • 2011-12-19
  • 2017-04-01
  • 2020-01-22
  • 2012-05-04
相关资源
最近更新 更多