2014-10-07 12 views
6

Ich habe eine Sammlung von libfooi.a; libfoo1.a, libfoo2.a, libfoo3.a ... dass die Verwendung von Factories (mit statischem Code) über eine gemeinsame Schnittstelle zum Erstellen von C++ - Objekten verfügt.Erstellen Sie eine statische Bibliothek mit einer anderen STATIC-Bibliothek, die Inhalt in iOS mit CMake

Mit CMake wähle ich eine von ihnen, und erstellen Sie eine libfooWrapper.a, die es verknüpfen und den gesamten Inhalt hinzufügen. Mit CMake diese CMakeLists.txt arbeitet in 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) 

Eine ausführbare Anwendung Projekt manuell erstellt, Just Link fooWrapper und Arbeit erzeugt.

Aber in iOS mit Clang, habe ich ADD_LIBRARY zu STATIC geändert, und versuchen Sie mit -Wl, - ganze Archiv aber nicht funktioniert. Ich habe die Dokumentation davon mit -Obj -WL überprüft, -force_load muss funktionieren. Ich habe auch versucht, Flag -Obj-Wl, -all_load zu verwenden.

Analysieren Bibliothek libfooWrapper.a mit Otool, scheint es, dass der gesamte Inhalt von libfooi.a ist nicht in libfooWrapper.a hinzugefügt, aber ich muss es innen setzen, um die Änderung manuell Flags in ausführbaren App-Projekt zu vermeiden.

Was ist mit der Verknüpfung falsch?

Antwort

7

Für iOS verwenden libtool eine einzelne statische Bibliothek von mehreren statischen Bibliotheken zu erstellen:

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> 
) 

Die Aktion Postbuild verschmilzt foo1, foo2 und foo3 in fooWrapper die CMake statische Bibliothek Ziele. Alternativ können Sie auch die vollständigen Pfade zu den Bibliotheken anstelle der Generatorausdrücke $<TARGET_FILE:...> verwenden.

Verwandte Themen