c++ - लिंक करते समय, "क्या जरूरत है पकड़ो" और "सभी को पकड़ो"(-Wl,-पूरे संग्रह) के बीच कुछ है?



linker ld (1)

आप लिंकर को किसी दिए गए फ़ंक्शन को रखने के लिए मजबूर कर सकते हैं (और स्वाभाविक रूप से, इस फ़ंक्शन से कहा गया सभी कोड)। लिंक-कमांड में जोड़ें -u my_function कई बिल्ड सिस्टम स्थैतिक पुस्तकालयों को उन लोगों के लिए बिल्ड सेटिंग 'निर्यात' करने देते हैं जो उनका उपयोग करते हैं। उदाहरण के लिए, एंड्रॉइड एनडीके-बिल्ड ढांचे के लिए, आप ऐसा कुछ निर्दिष्ट कर सकते हैं

include $(CLEAR_VARS)
LOCAL_MODULE := the_best_static_library
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_LDFLAGS := -u my_function
include $(PREBUILT_STATIC_LIBRARY)

अपने मॉड्यूल Android.mk में लोग इसे सरल एंड्रॉइड में जोड़कर इसका पुन: उपयोग कर सकते हैं

$(call import-module,third_party/the_best_static_library)

NB काम करने के लिए इस दृष्टिकोण के लिए, my_function() को static घोषित नहीं किया जा सकता। यदि कुछ प्रतीक को फ़ाइल के दायरे में स्थिर के रूप में घोषित किया जाता है, तो लिंकर का अनुमान है कि यह नाम से बिल्कुल नहीं जानता है। सौभाग्य से, यदि यह कुछ कोड में संदर्भित होता है जो लिंकर रखने का निर्णय करता है, तो यह भी छीन नहीं पाएगा इसके अलावा, जब तक आप एक विशेष प्रयास नहीं करते हैं , लिंकर पूरी संकलन इकाइयों (उर्फ सी फाइल) को पट्टी या रख देगा। इस प्रकार, यह आमतौर पर कई कार्यों और डेटा को बनाए रखने के लिए एक डमी फ़ंक्शन "एंकर" के लिए पर्याप्त होता है

मेरे पास यह लाइब्रेरी है जिसमें कुछ स्थिर इनिशियलाइज़ेशन कोड शामिल है जो main() से पहले चलाने की जरूरत है। यह सब अच्छी तरह से काम करता है यदि आप सभी अनुवाद इकाइयों को एक साथ .a करते हैं, लेकिन अगर मैं एक स्थैतिक पुस्तकालय ( .a फाइल) प्रदान करता है और इसके साथ उपयोगकर्ता अपने आवेदन लिंक करते हैं तो यह काम नहीं करता है - लिंकर केवल उन प्रतीकों की उपेक्षा करता है जो मेरी स्थैतिक आरंभीकरण

वैकल्पिक, वाई मैं स्थिर लाइब्रेरी में लिंकर को सब कुछ चुन सकता हूं, अगर मैं -Wl,--whole-archive निर्दिष्ट करता -Wl,--whole-archive जीसीसी को -Wl,--whole-archive विकल्प, यानी जीएनयू लिंक के लिए --whole-archive विकल्प निर्दिष्ट करें।

लेकिन क्या कुछ बीच का मैदान है? क्या मैं कुछ प्रतीकों को चिह्नित कर सकता हूं और लिंकर को हमेशा निष्पादन योग्य बनाने के लिए चुनता हूं, जबकि शेष प्रतीकों को केवल तभी जोड़ दिया जाता है जब जरूरत होती है?

प्रेरणा: मैं एक कारखाने में कक्षाएं पंजीकृत करने के लिए कुछ स्थिर ब्लॉक का उपयोग करता हूं; मैं अपने कोड को (गैर-गतिशील) लाइब्रेरी के रूप में उपलब्ध करना चाहता हूं, बिना उपयोगकर्ता कोड को फैक्ट्री के लिए किसी भी "जादू अभिप्रेरण" के बिना आबाद होना चाहिए।

कुछ संबंधित प्रश्न:





static-block