2012-06-16 10 views
5

के लिए एक स्थिर लाइब्रेरी को कैसे लिंक करें मैंने .o फ़ाइलों का एक गुच्छा बनाया है (gcc -c $file.c $someotherops -o $file.o के माध्यम से)। अब मैं उन्हें एक स्थिर पुस्तकालय में जोड़ना चाहता हूं।आईओएस

मुझे बिल्कुल यकीन नहीं है कि मुझे ld या gcc का उपयोग करना चाहिए। ld मैनुअल में, ऐसा कहा जाता है कि मुझे इसका उपयोग सीधे नहीं करना चाहिए। हालांकि, मैं स्थिर पुस्तकालय बनाने के लिए जीसीसी पैरामीटर को नहीं समझ सकता।

मैंने ld *.o -static -o libfoo.a की कोशिश की लेकिन यह बहुत सारे गायब प्रतीकों (मुझे लगता है कि सभी libc से) के बारे में शिकायत करते हैं। मुझे समझ में नहीं आता कि यह शिकायत क्यों करता है क्योंकि यह एक स्थिर पुस्तकालय माना जाता है। मैंने सोचा कि यह उस स्थिर पुस्तकालय को किसी अन्य चीज़ से लिंक करने के बाद प्रतीकों की जांच करेगा।

एक और बात: मैं यहां /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ld का उपयोग करता हूं (मेरा लक्ष्य आईओएस है)। यह चेतावनी ld: warning: using ld_classic के साथ शिकायत करता है। इसके बारे में क्या है?

तब मैंने सोचा, शायद इसे गतिशील पुस्तकालय निर्दिष्ट करने की आवश्यकता है। तो मैंने libc के खिलाफ लिंक करने के लिए -lc जोड़ा। लेकिन यह can't locate file for: -lc के साथ शिकायत करता है। मैंने -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib जोड़ा और libc.dylib है।

कोई विचार?


-lc त्रुटि के बारे में: यह भाग गया के बाद मैं -arch armv6 निर्दिष्ट। फिर उसने गलत libcache.dylib (जिसे libc.dylib से लिंक किया जाना चाहिए) के बारे में शिकायत की क्योंकि मुझे लगता है क्योंकि उसने इसे निर्दिष्ट नहीं किया है)। -L.../usr/lib/system जोड़ना मदद की।

अब, प्रत्येक एकल .o फ़ाइल के लिए, मुझे चेतावनी ld: warning: CPU_SUBTYPE_ARM_ALL subtype is deprecated मिलती है। इसके बारे में क्या है?

और मैं अभी भी लापता प्रतीकों में से एक गुच्छा, esp है:

Undefined symbols for architecture armv6: 
    "start", referenced from: 
    -u command line option 
    (maybe you meant: _PyThread_start_new_thread) 
    "___udivsi3", referenced from: 
     _get_len_of_range in bltinmodule.o 
     _quorem in dtoa.o 
     _array_resize in arraymodule.o 
     _newarrayobject in arraymodule.o 
     _array_fromfile in arraymodule.o 
     _get_len_of_range in rangeobject.o 
     _inplace_divrem1 in longobject.o 
     ... 
    "___unorddf2", referenced from: 
     _builtin_round in bltinmodule.o 
    ... 

मैं उन प्रतीक लिखें, जैसे के कुछ जाँच get_len_of_range में। यह फ़ंक्शन केवल सी अंकगणित का उपयोग करता है, कोई बाहरी कॉल नहीं। तो ऐसा लगता है कि ___udivsi3 जैसे कुछ बाहरी कार्यों का उपयोग करने के लिए इसका अनुवाद किया जा रहा है। लेकिन इसमें कौन सी पुस्तकालय है?


-lgcc_s.1___udivsi3 का सबसे तय की और लापता प्रतीकों से संबंधित। start प्रतीक अभी भी गायब है। -u command line option का क्या अर्थ है?


here से, मैं लग रहा है कि शायद ld सही उपकरण सभी के बाद नहीं है मिला है। वहां, ar पर एक साधारण कॉल का उपयोग किया जाता है। और यह और अधिक समझ में आता है। मैं जांच करूंगा कि क्या यह काम करता है और फिर इसे एक जवाब में बदल देता है।


भर में और अधिक खेलने के दौरान, ar कुछ चेतावनियों मुझ पर जब एक वसा स्थिर लाइब्रेरी बनाना फेंक देते हैं। इसने मुझे libtool का उपयोग करने के लिए संकेत दिया। यही वह है जो मैं अब कर रहा हूं, यानी libtool -static -o libfoo.a *.o। इसके अलावा मैंने कंपाइलर को /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang पर स्विच किया लेकिन यह सुनिश्चित नहीं है कि यह महत्वपूर्ण है या नहीं।

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in __PyBuiltin_Init from /Users/az/Programmierung/python-embedded/libpython.a(bltinmodule.o). To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie 
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000004 (0x001B70CC) to 0x1001B70C4 
ld: warning: 32-bit absolute address out of range (0x1001B70C4 max is 4GB): from _usedpools + 0x00000000 (0x001B70CC) to 0x1001B70C4 

क्या वे के बारे में कर रहे हैं:

अब, कुछ परीक्षण आवेदन जो इस स्थिर पुस्तकालय के लिए लिंक संकलन में, मैं इन चेतावनियों मिल सकता है? मैं -mdynamic-no-pic का उपयोग नहीं करता हूं। मैं वास्तव में _PyBuiltin_Init में भी नहीं देखता हूं कि मैं वहां पूर्ण पते का उपयोग कैसे करता हूं।

इसके अलावा, इन पूर्ण पते के बारे में क्या सीमाएं हैं? संपादित करें: ये कुछ वास्तव में विशाल आवंटन थे। मैंने अभी इस कोड को अभी हटा दिया है (यह WITH_PYMALLOC था, अगर कोई इन विशिष्ट पायथन इंटर्नल्स में रूचि रखता है)।

जब मैं इसे अपने iPhone पर शुरू, मैं बीच में बंद करें मिलता है: जब मैं जोड़ने के लिए -no_pie का उपयोग

dyld: vm_protect(0x00001000, 0x00173000, false, 0x07) failed, result=2 for segment __TEXT in /var/mobile/Applications/C15D9525-E7DC-4463-B05B-D39C9CA24319/...

, तो यह और भी लिंक नहीं है।

Illegal text-relocation to ___stderrp in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/libSystem.dylib from _read_object in /Users/az/Programmierung/python-embedded/libpython.a(marshal.o) for architecture armv7


मैं पाई विकलांग, निरपेक्ष को संबोधित त्रुटि हल: यह साथ विफल रहता है। मेरे कमांड लाइन क्लैंग में मेरे पास -static था। एक बार मैंने इसे हटा दिए जाने के बाद, चेतावनी दूर हो गई, साथ ही साथ dyld/vm_protect त्रुटि। यह पहली बार था जब यह वास्तव में कुछ कोड चलाता था।

जब तक मैं another strange error about integer comparison हिट नहीं करता। जिससे यह उनके क्लैंग बिल्ड में एक बग की तरह दिखता है।

+0

एक प्रश्न; आप एक्सको स्टैटिक लाइब्रेरी प्रोजेक्ट क्यों नहीं बनाते हैं और उस परियोजना के साथ आपको स्टेटिक लाइब्रेरी बनाते हैं? – CarlJ

+0

@meccan: मैं इस मामले में विविधता कारणों के लिए अपनी खुद की संकलन स्क्रिप्ट लेना चाहता हूं (अधिकांशतः क्योंकि इस विशेष परियोजना के लिए, यह अब बहुत आसान है)। वैसे भी, अगर मैं इसे एक्सकोड के साथ करता हूं, तो यह प्रश्न मान्य/खुला रहता है क्योंकि मैं समझना चाहता हूं कि इसे मैन्युअल रूप से कैसे किया जाए। – Albert

+0

ठीक है, और आप जानते हैं कि आप खोल से एक एक्सकोड परियोजना बना सकते हैं? – CarlJ

उत्तर

12

यह सब अब काम करता है। असल में, जवाब है:

  • बस *.o फ़ाइलों के लिए हमेशा की तरह हर *.c फ़ाइल संकलन। एकमात्र वास्तविक अंतर अलग-अलग जीसीसी/क्लैंग, -arch armv7 है, विभिन्न एसडीके/डीआईआर शामिल हैं।

  • स्थिर पुस्तकालय बनाने के लिए libtool -static -o libfoo.a *.o का उपयोग करें।

यही है। मेरे प्रश्न में अन्य समस्याएं गलत तरीके से चल रही थीं।

1

यदि कोई dyld: vm_protect(...) रनटाइम त्रुटि की खोज करके यहां पहुंच जाता है लेकिन आप एक्सकोड का उपयोग कर रहे हैं, तो ओपी में उल्लिखित -static ध्वज की समस्या है।

एलएलवीएम कंपाइलर भाषा सेटिंग्स में "साझा लाइब्रेरीज़ के साथ लिंकिंग सक्षम करें" को "हां" (डिफ़ॉल्ट) में स्विच करके इसे से छुटकारा पाएं। (यह प्रोजेक्ट फ़ाइल से GCC_LINK_WITH_DYNAMIC_LIBRARIES = NO हटा देता है)।