【问题标题】:How to include static libraries in a static library?如何在静态库中包含静态库?
【发布时间】:2021-07-29 14:32:38
【问题描述】:

我在两个不同的文件夹中有 2 个静态库:libAlibB

  • libB 必须包含 libA

我的主要 CMakeLists.txt 是:

add_subdirectory(libA)
add_subdirectory(libB)

我的第一个错误是认为在 libB 中链接 libA 会包含它,但事实并非如此:

target_link_libraries(${PROJECT_NAME} PUBLIC libA::libA)

当我尝试在应用中使用 libB 时,我收到了 undefined reference to some libA's functions

【问题讨论】:

    标签: cmake


    【解决方案1】:

    如果您控制libAlibB 的构建,则可以通过创建OBJECTlibA-objlibB-obj 来解决此问题。然后将libA-obj 链接到libA,然后将both 对象库链接到libB


    这是一个更详细的草图

    cmake_minimum_required(VERSION 3.22)
    project(example)
    
    # ...
    
    # Can be in subdirectory
    add_library(libA-obj ${libA-srcs})
    add_library(libA)
    target_link_libraries(libA PUBLIC libA-obj)
    
    # Can be in subdirectory
    add_library(libB-obj ${libB-srcs})
    add_library(libB)
    target_link_libraries(libB PUBLIC libB-obj libA-obj)
    
    # Can be in parent directory
    add_executable(app ${app-srcs})
    target_link_libraries(app PRIVATE libB)
    

    【讨论】:

    • 谢谢,但是怎么做?我完全迷失了所有仅部分完成我想要的示例。我在每个 CMakeLists.txt 中都有add_library(objlib OBJECT ${SRC}),但最上面的呢?
    • @Alexis - 我已更新我的答案以包含更详细的草图
    • 如果我不需要 libA 的静态库怎么办?另外,如果有第三个嵌套的 libC 怎么办? libA->libB-libC?我不想在 libC 中引用 libA,因为它已经在 libB 中。
    【解决方案2】:

    您可以将组成libA 的目标文件添加到libB 的源中以包含它们:

    target_sources(LibB PRIVATE $<TARGET_OBJECTS:LibA>)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多