我有一个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, - 整个存档但不起作用。我已经检查过使用-Obj -Wl的文档,-force_load必须正常工作。我也尝试使用标志-Obj -Wl,-all_load。
使用otool分析库libfooWrapper.a,似乎libfooi.a中的所有内容都没有添加到libfooWrapper.a中,但我需要将其放入内部以避免在可执行应用程序项目中手动更改标记。
链接有什么问题?
答案 0 :(得分:7)
对于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>
)
post build动作将CMake静态库目标foo1,foo2和foo3合并到fooWrapper中。
或者,您也可以使用库的完整路径而不是$<TARGET_FILE:...>
生成器表达式。