【问题标题】:Create a STATIC library with another STATIC library that content inside in iOS using CMake使用 CMake 在 iOS 中创建一个包含另一个 STATIC 库的 STATIC 库
【发布时间】:2014-12-01 12:51:45
【问题描述】:

我有一个 libfooi.a 的集合; libfoo1.a、libfoo2.a、libfoo3.a ... 使用工厂(带有静态代码)具有创建 C++ 对象的通用接口。

使用 CMake,我选择其中一个,然后创建一个 libfooWrapper.a 链接它并添加所有内容。使用 CMake 这个 CMakeLists.txt 在 Android 中工作:

PROJECT(fooWrapper)

INCLUDE_DIRECTORIES(___)

ADD_LIBRARY(fooWrapper SHARED ${SRC} ${HEADERS} ) # Must be STATIC in iOS

IF(selected1)
  TARGET_LINK_LIBRARIES(fooWrapper -Wl,--whole-archive foo1 -Wl,--no-whole-archive)
ELSEIF(...)
  TARGET_LINK_LIBRARIES(fooWrapper -Wl,--whole-archive foo2 -Wl,--no-whole-archive)

手动创建的可执行应用项目,只需链接生成的 fooWrapper 即可工作。

但在使用 Clang 的 iOS 中,我已将 ADD_LIBRARY 更改为 STATIC,并尝试使用 -Wl,--whole-archive 但不起作用。我已经检查了使用 -Obj -Wl,-force_load 必须工作的文档。我也尝试过使用标志-Obj -Wl,-all_load。

使用otool分析库libfooWrapper.a,似乎libfooi.a中的所有内容都没有添加到libfooWrapper.a中,但我需要将其放入其中以避免在可执行应用程序项目中手动更改标志。

链接有什么问题?

【问题讨论】:

    标签: ios cmake cross-platform static-linking


    【解决方案1】:

    对于 iOS,使用 libtool 从多个静态库中创建一个静态库:

    add_library(fooWrapper STATIC ${SRC} ${HEADERS} )
    
    add_custom_command(TARGET fooWrapper POST_BUILD
        COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:fooWrapper>
        $<TARGET_FILE:fooWrapper> $<TARGET_FILE:foo1> $<TARGET_FILE:foo2> $<TARGET_FILE:foo3>
    )
    

    构建后操作将 CMake 静态库目标 foo1、foo2 和 foo3 合并到 fooWrapper。 或者,您也可以使用库的完整路径而不是 $&lt;TARGET_FILE:...&gt; 生成器表达式。

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2016-08-16
      • 1970-01-01
      • 2022-01-04
      • 2017-08-07
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多