2013-07-03 9 views
5

बनाने मैं gcc के ld जब -fpic ध्वज के साथ संकलित ऑब्जेक्ट फाइलों का एक समूह से एक साथ एक साझा पुस्तकालय डाल अनसुलझे संदर्भ की अनदेखी करने के लिए कोशिश कर रहा हूँ अपरिभाषित संदर्भ की अनदेखी करने के।हो रही ld जब एक साझा lib

मैं अब तक इस तरह के रूप (संक्षिप्तता के लिए कुछ छोटे लोगों के साथ कई वस्तु फ़ाइलों की लंबी फ़ाइल नाम की जगह) विकल्पों में से एक गुच्छा की कोशिश की:

ld --allow-shlib-undefined --unresolved-symbols=ignore-all -shared 1.o 2.o -o lib0.so 
ld -G 1.o 2.o -o lib0.so 

(मैंने लाल somewhere कि -G होगा अनसुलझे संदर्भ की अनुमति देते हैं, लेकिन यह के साथ कोई किस्मत थी।)

यह चल रहा है, हालांकि gcc (-Wl,--unresolved-symbols=ignore-all के साथ) कम अनसुलझे संदर्भ में परिणाम के रूप में यह

-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt 
साथ डिफ़ॉल्ट रूप से लिंक

लेकिन यह अभी भी -lopengl32 और -lgdi32 नहीं होने के बारे में शिकायत करता है।

, -fpic बिना lib संकलन इसे करने के लिए ar और स्थिर जोड़ने के साथ एक .a में सभी वस्तु फ़ाइलों stashing जबकि पूरी तरह से ठीक काम कर रहा में करने के लिए -lopengl32 और -lgdi32 परिणाम exe कार्यक्रम लिंक हो रही है।

[file].o: In function `[function]': [file].cpp:19: undefined reference to `memcpy' 
[file].o: In function `[function]': [file].cpp:26: undefined reference to `memcpy' 

[file].o:[file].cpp:(.xdata+0x4c): undefined reference to `__gxx_personality_seh0' 
[file].o:[file].cpp:(.xdata+0x74): undefined reference to `__gxx_personality_seh0' 
[file].o:[file].cpp:(.rdata$[file]]+0x20):undefined reference to `__cxa_pure_virtual' 
[file].o:[file].cpp:(.rdata$[file]]+0x28): undefined reference to `__cxa_pure_virtual' 

मैं ld कैसे प्राप्त कर सकता अपरिभाषित संदर्भ की अनदेखी करने के (कम से कम libopengl32 से और libgdi32 नहीं करता है, तो libstdc++ आदि भी) और:

वास्तविक त्रुटि संदेश (संक्षिप्तता के लिए लंबे समय से फ़ाइल और समारोह के नाम की जगह) कार्यक्रम का उपयोग करने जा रहे हैं जो उन्हें लिंक करने के लिए जा रहे हैं?

+0

जब मुझे अपनी सामग्री में '__gxx_personality_seh0' त्रुटि मिली तो मैंने gcc के बजाय g ++ के साथ संकलित किया और यह चला गया। देखें कि यह आपके लिए काम करता है या नहीं। –

+0

@JerryJeremiah वहां कई त्रुटियों में से एक है, मूल रूप से प्रत्येक कॉल के लिए 'memcpy', openl to any call, आदि के लिए प्रत्येक कॉल के लिए एक और यह मुद्दा यह है कि मैं 'ld' का उपयोग करने की कोशिश नहीं कर रहा हूं 'g ++', प्रोग्राम '.o' फ़ाइलों के लिए ठीक से संकलित कर रहा है, मैं बस' ld' को अन्य libs से लिंक नहीं करते समय '.o' फ़ाइलों से साझा lib बनाने के लिए चाहता हूं। स्थिर स्थिर lib बनाने के लिए 'ld' का उपयोग करते समय यह ठीक काम करता है, लेकिन जब साझा किया जाता है, तो यह stdlib, opengllib, आदि से लिंक न करने की शिकायत करता है। यह प्रोग्राम जो std, opengl आदि के स्थिर lib लिंक का उपयोग करता है, उसे चाहिए सिद्धांत में भी साझा करने के लिए काम करते हैं। –

उत्तर

0

मैं कैसे ld अपरिभाषित संदर्भ

जीएनयू ld (और अधिकांश अन्य यूनिक्स linkers) जब एक साझा लाइब्रेरी बनाना पहले से ही अपरिभाषित संदर्भ पर ध्यान नहीं देता अनदेखी करने के लिए मिल सकता है।

ऐसा लगता है कि आप AIX पर हो सकते हैं, जहां साझा पुस्तकालय और निष्पादन योग्य बहुत समान हैं, और विशेष नियम लागू होते हैं। g++ -shared ... अभी भी एईक्स पर भी काम करना चाहिए।

+0

मुझे यकीन नहीं है कि आप AIX द्वारा क्या मतलब रखते हैं, मुझे इसका उल्लेख करना चाहिए था, लेकिन मैं नवीनतम mingw रिलीज के साथ Win8 पर हूं ('gcc (rev0, MinGW-builds प्रोजेक्ट द्वारा निर्मित) 4.8.1') और ('जीएनयू एलडी (जीएनयू बिनुटिल्स) 2.23.2') और नहीं,' जी ++ -श्रेड ... -o libout.so' के परिणामस्वरूप stdlib से कोई अपरिभाषित संदर्भ नहीं है लेकिन यह अभी भी opengl32 और gdi से जुड़ा हुआ है। ('__imp_glCullFace' 'के अनिर्धारित संदर्भ,' __imp_glClearDepth 'आदि के लिए अनिर्धारित संदर्भ), सुझाव के लिए धन्यवाद, हालांकि, कोई अन्य विचार क्यों' ld' 'अनदेखा-प्रतीकों = अनदेखा-सब' को अनदेखा करता है? –

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