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

问题描述 投票:7回答:1

我有一个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中,但我需要将其放入内部以避免在可执行应用程序项目中手动更改标志。

链接有什么问题?

ios cmake cross-platform static-linking
1个回答
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构建操作将CMake静态库目标foo1,foo2和foo3合并到fooWrapper中。或者,您也可以使用库的完整路径而不是$<TARGET_FILE:...>生成器表达式。

© www.soinside.com 2019 - 2024. All rights reserved.