使用另一个STATIC库创建一个STATIC库,该库使用CMake在iOS中内容

vgo*_*anz 7 cross-platform cmake static-linking ios

我有一个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)
Run Code Online (Sandbox Code Playgroud)

手动创建的可执行应用程序项目,只是链接生成的fooWrapper和工作.

但是在使用Clang的iOS中,我将ADD_LIBRARY更改为STATIC,并尝试使用-Wl, - 整个存档但不起作用.我已经检查过使用-Obj -Wl的文档,-force_load必须正常工作.我也尝试使用标志-Obj -Wl,-all_load.

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

链接有什么问题?

sak*_*kra 7

For iOS, use libtool to create a single static library from multiple static libraries:

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>
)
Run Code Online (Sandbox Code Playgroud)

The post build action merges the CMake static library targets foo1, foo2 and foo3 into fooWrapper. Alternatively, you can also use the full paths to the libraries instead of the $<TARGET_FILE:...> generator expressions.