2010-10-05 11 views
19

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

यूनिक्स के तहत जहां हम जीसीसी का उपयोग करते हैं, मैं झंडे को पार कर सकता हूं - लिंकर एलडी (नीचे एलडी दस्तावेज से उद्धरण देखें), जो एलडी को किसी ऑब्जेक्ट को त्याग नहीं देता है। क्या दृश्य सी ++ के लिए ऐसा कुछ है?

--whole-संग्रह

        प्रत्येक संग्रह
        `--whole-संग्रह 'विकल्प के बाद कमांड लाइन पर उल्लेख के लिए, में हर वस्तु फ़ाइल शामिल संग्रह
      कड़ी में  , बजाय आवश्यक
के लिए संग्रह खोज        ऑब्जेक्ट फ़ाइलें। यह सामान्य रूप से
        साझा लाइब्रेरी जिसके परिणामस्वरूप में शामिल किया जाना
        में किसी साझा लाइब्रेरी एक संग्रह फ़ाइल चालू करने के लिए, हर वस्तु के लिए मजबूर किया जाता है। यह विकल्प एक से अधिक बार इस्तेमाल किया जा सकता है।

+0

'--whole-archive' की व्याख्या के लिए धन्यवाद, मैं सिर्फ था इसका उपयोग करने के लिए परिदृश्य क्या है। – Deqing

उत्तर

7

मेरे ज्ञान के लिए, कोई भी विकल्प नहीं है जो विश्वसनीय रूप से इसकी गारंटी देता है। ऑप्टिमाइज़िंग विकल्पों के संयोजन हैं जो (चुपचाप) इसे निष्क्रिय करते हैं, इसलिए कोई रास्ता नहीं ... /INCLUDE काम करता है, लेकिन इसके लिए आपको प्रतीक के उलझन वाले नाम को निकालने और हार्डकोड करने की आवश्यकता है। आपके पास दो विकल्प हैं: (1) सुनिश्चित करें कि सभी रजिस्ट्रार main युक्त अनुवाद इकाई में निहित (शामिल) हैं और उनके उपयोग को लागू करते हैं। (2) इस 'मुहावरे' को छोड़ दें और स्पष्ट पंजीकरण का प्रयोग करें।

सावधानी: यह उत्तर अब लगभग 7 वर्ष पुराना है और एमएसवीसी ++ टूलचैन में विकल्पों की उपलब्धता के बारे में बयान पुराना है। फिर भी मैं अभी भी रजिस्ट्रार पैटर्न पर भरोसा न करने और विकल्पों को देखने की सलाह नहीं देता हूं। कृपया इस सिफारिश के कारण वोट को कम करने के लिए स्वतंत्र महसूस करें, लेकिन मुझे लगता है कि यह वोट कम करने के लिए थोड़ा सा अनुचित है क्योंकि इस दौरान विकल्प को माइक्रोसॉफ्ट लिंकर में जोड़ा गया था।

+0

धन्यवाद। मैं एक छोटा कार्यक्रम बनाने के लिए मार्ग चला गया जो स्थिर लिब से सभी प्रतीक नाम निकालता है और उन्हें मुख्य कार्यक्रम में शामिल करता है। – fschmitt

+1

स्पष्ट रूप से यह लगभग दो वर्षों के बाद चुपचाप दो बार गिर गया। क्या आप कारण के बारे में एक पंक्ति छोड़ सकते हैं? –

+0

@fschmitt क्या आपको कभी इस समस्या का बेहतर समाधान मिला है? –

7

मुझे विश्वास है कि निकटतम समकक्ष /OPT:NOREF होगा।

+1

कोई प्रभाव नहीं लग रहा है, esp। यह डीबग बिल्ड में निहित है पर विचार कर रहा है। –

+0

यह करना चाहिए, लेकिन बिल्कुल काम नहीं करना चाहिए, न केवल मेरे लिए। बहुत ही दुर्भाग्यपूर्ण। –

4

मैं अप्रयुक्त प्रतीकों को शामिल करने के लिए /INCLUDE: का उपयोग करता हूं।

0

मैंने .lib पर सबकुछ संकलित करने के बजाय एक और दृष्टिकोण का उपयोग किया और फिर निष्पादन योग्य में .lib लिंक करें, मैं निष्पादन योग्य को सीधे .obj फ़ाइलों के विरुद्ध लिंक करता हूं।

CMake में, यह इस तरह से बनाया जा सकता है:

add_library(common OBJECT ${common_sources}) 
add_executable(executable1 "main1.cc" $<TARGET_OBJECTS:common> 
add_executable(executable2 "main2.cc" $<TARGET_OBJECTS:common> 

${common_sources}) में फ़ाइलों के किसी भी बदलने से केवल उनके समकक्ष वस्तुओं recompiles और निष्पादनयोग्य relinks, जो एक ही लाभ प्रदान करता है के रूप में यदि आप मध्यवर्ती के माध्यम से चीजों को जुड़ा हुआ .lib। साथ ही, सभी स्थिर रचनाकार जगह पर रहते हैं, जो इस मुद्दे को हल करता है।

ध्यान दें कि यह केवल तभी उपयोगी है जब आप चीजों को स्थिर रूप से लिंक करते हैं।

यह दृष्टिकोण जीसीसी 5.2.0, MinGW-W64 5.2.0 और MSVC 15.

0

आम गुण/संदर्भ में निष्पादन योग्य देखो की संपत्ति पेज के साथ परीक्षण किया गया था/उपयोग पुस्तकालय निर्भरता इनपुट सेट सच है कि । संक्षेप में यह बहुत अधिक एमएस समकक्ष - व्हाहोल-आर्काइव है।

संपादित करें: हालांकि प्रश्न में पुस्तकालय समाधान का हिस्सा होना चाहिए।

+0

क्या आप इसे कमांड लाइन विकल्प के रूप में दे सकते हैं? –

+0

नहीं, यह सभी obj फ़ाइलों को lib फ़ाइल के बजाय लिंकर कमांड में जोड़ता है। –

16

दृश्य स्टूडियो में विजुअल C++ के संस्करण 2015 अपडेट 2 /WHOLEARCHIVE बुलाया link.exe के लिए एक नया झंडा है, जो ld को --whole-archive विकल्प के बराबर कार्यक्षमता है भी शामिल है। the flag documentation के अनुसार:

/WHOLEARCHIVE विकल्प लिंकर बलों या तो एक निर्धारित स्थिर पुस्तकालय से हर वस्तु फ़ाइल शामिल करने के लिए, या अगर कोई पुस्तकालय निर्दिष्ट, लिंक आदेश करने के लिए निर्दिष्ट सभी स्थैतिक पुस्तकालयों से है।

+0

वाह, यह बहुत बड़ा है। जानकारी के लिए धन्यवाद। – fschmitt

3

आप की तरह CMake के साथ उपयोग कर सकते हैं:

add_executable(hello ${SOURCE_FILES}) 
target_link_libraries(hello libA libB libC)  # Not need /wholearchive libC 
set_target_properties(hello PROPERTIES LINK_FLAGS "/WHOLEARCHIVE:libA /WHOLEARCHIVE:libB") 

नोट: /WHOLEARCHIVE ही उपलब्ध विजुअल स्टूडियो 2015 अपडेट 2 +

संबंधित मुद्दे