2014-10-07 13 views
6

का उपयोग करते हुए आईओएस में सामग्री के साथ एक और स्टेटिक लाइब्रेरी के साथ एक स्टेटस लाइब्रेरी बनाएं, मेरे पास libfooi.a का संग्रह है; libfoo1.a, libfoo2.a, libfoo3.a ... कि कारखानों (स्थिर कोड के साथ) का उपयोग C++ ऑब्जेक्ट्स बनाने के लिए एक आम इंटरफ़ेस है।सीएमके

सीएमके के साथ मैं उनमें से एक चुनता हूं, और libfooWrapper.a बनाता हूं जो इसे लिंक करता है और सभी सामग्री जोड़ता है। CMake का उपयोग करते हुए इस CMakeLists.txt एंड्रॉयड में काम करता है:

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 और काम से उत्पन्न लिंक।

लेकिन क्लैंग का उपयोग करके आईओएस में, मैंने ADD_LIBRARY को स्टेटिक में बदल दिया है, और -Wl का उपयोग करने का प्रयास करें, - संपूर्ण संग्रह लेकिन काम नहीं करता है। मैंने -Obj -Wl का उपयोग करके उस दस्तावेज़ के दस्तावेज की जांच की है, -force_load को काम करना चाहिए। मैंने फ्लैग-ओबीजे -Wl, -all_load का उपयोग करके भी कोशिश की है।

लाइब्रेरी libfooWrapper.a का विश्लेषण otool के साथ, ऐसा लगता है कि libfooi.a से सभी सामग्री libfooWrapper.a में नहीं जोड़ा गया है, लेकिन मुझे निष्पादन योग्य ऐप प्रोजेक्ट में मैन्युअल रूप से झंडे से बचने के लिए इसे अंदर रखना होगा।

लिंकिंग में क्या गलत है?

उत्तर

7

आईओएस के लिए, कई स्थिर पुस्तकालयों से एक भी स्थिर पुस्तकालय बनाने के लिए 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> 
) 

पोस्ट का निर्माण कार्रवाई CMake स्थिर पुस्तकालय लक्ष्य foo1, foo2 और foo3 fooWrapper में विलीन हो जाती। वैकल्पिक रूप से, आप $<TARGET_FILE:...> जनरेटर अभिव्यक्तियों के बजाय पुस्तकालयों के पूर्ण पथ का भी उपयोग कर सकते हैं।