2014-10-07 9 views
6

Mam kolekcję libfooi.a; libfoo1.a, libfoo2.a, libfoo3.a ... że używanie fabryk (z kodem statycznym) ma wspólny interfejs do tworzenia obiektów C++.Utwórz bibliotekę STATIC z inną biblioteką STATIC, której zawartość w systemie iOS używa CMake

Z CMake wybieram jedną z nich i tworzę libfooWrapper.a, która łączy ją i dodaje całą zawartość. Korzystanie CMake to CMakeLists.txt działa w Androidzie:

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) 

wykonywalny aplikacji projekt tworzony ręcznie, po prostu link wygenerowany fooWrapper i pracy.

Ale w systemie iOS przy użyciu języka Clang zmieniłem ADD_LIBRARY na STATIC i spróbuj użyć -Wl, - całe archiwum, ale nie działa. Sprawdziłem dokumentację tego przy użyciu -Obj -Wl, -force_load musi działać. Próbowałem też używać flagi -Obj -Wl, -all_load.

Analizowanie biblioteki libfooWrapper.a z otool, wydaje się, że cała zawartość z libfooi.a nie jest dodana do libfooWrapper.a, ale muszę umieścić ją w środku, aby uniknąć ręcznego zmieniania flag w projekcie aplikacji wykonywalnej.

Co jest nie tak z łączeniem?

Odpowiedz

7

Dla iOS, użyj libtool stworzenie jednolitego biblioteki statyczne z wielu bibliotek statycznych:

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

Akcja po kompilacji scala CUpewnij cele biblioteki statyczne foo1, foo2 i foo3 do fooWrapper. Można również użyć pełnych ścieżek do bibliotek zamiast wyrażeń generatorowych $<TARGET_FILE:...>.