2009-05-21 8 views
5

मुझे यकीन नहीं है कि यह क्यों है। मैं कई परियोजनाओं में एक स्थिर * .lib वितरित कर रहा हूं, लेकिन यह स्थैतिक lib कई * .obj फ़ाइलों को उत्पन्न करता है। ऐसा लगता है कि मुझे उन * .obj फ़ाइलों को * .lib के साथ वितरित करने की आवश्यकता है। अन्यथा, मुझे यह त्रुटि मिलती है:स्थिर रूप से लिंक करते समय मुझे * .obj फ़ाइल की आवश्यकता क्यों है?

1>LINK : fatal error LNK1181: cannot open input file 'nsglCore.obj' 

यह क्यों है? * .lib में * .obj फ़ाइलों में डेटा शामिल करने का कोई तरीका है? शायद संकलक में एक स्विच?

यह स्थिर पुस्तकालय के लिए मेरे config है:

C/C++

/Od /GT /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MD /Yu"stdafx.hpp" /Fp"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\nsglCore-Win32-Release.pch" /Fo"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt 

लाइब्रेरियन

/OUT:"e:\Development\Projects\nsGameLib\Source\Core\Output\nsglCore-Win32-Release.lib" /NOLOGO /LTCG 

यह स्थिर लाइब्रेरी का उपयोग कर परियोजना के लिए मेरी config है :

C/C++

/O2 /Oi /I "E:\Development\Projects\nsGameLib\Samples\\DummyEngine\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt 

लिंकर

/OUT:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Output\SampleOnlyCore-Win32-Release.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\Development\Projects\nsGameLib\Samples\..\Deployment\Libraries" /MANIFEST /MANIFESTFILE:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT nsglCore kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 

उत्तर

5

मेरा मानना ​​है कि आपकी लिंकर लाइन गलत है। लाइब्रेरी में .lib प्रत्यय होना चाहिए। तो nsglCorensglCore-Win32-Release.lib या शायद nsglCore-$(TargetPlatform)-$(ConfigurationName).lib या जो भी सही मैक्रो विस्तार होना चाहिए।

+1

20 सेकंड बाद मुझे पता चला! मेरी पोस्ट देखें लेकिन, यह जवाब है;) – Veehmot

3

आह ... दृश्य स्टूडियो परियोजनाओं कि lib शामिल करने के लिए आप

जाओ बहुत चालाक किया जा रहा है, है ना गुणों के लिए क्लिक करें

गोटो कॉन्फ़िगरेशन गुण | लिंकर

निचले भाग के पास: उपयोग लाइब्रेरी dependancy इनपुट - कोई

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

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

+0

मेरे पास यह सेट पहले से ही नहीं है। – Veehmot

4

आम तौर पर, स्थिर libs ऑब्जेक्ट फ़ाइलों को उत्पन्न नहीं करते हैं। आप जो करते हैं वह ऑब्जेक्ट फाइलें बनाते हैं और उन्हें लाइब्रेरी में रखते हैं, तो लिंकर उन पुस्तकालयों में ऑब्जेक्ट फ़ाइलों की खोज करेगा।

मैं एक यूनिक्स कमांड लाइन प्वाइंट व्यू से समझाऊंगा क्योंकि यह समझने में आसान है (मुझे नहीं पता कि मूलभूत सामग्री करने से पहले वीसीएस क्या करता है)।

एक निष्पादन योग्य बनाने के लिए एक नमूना आदेश पंक्ति है:

gcc -c -o prog.o prog.c 
gcc -o prog prog.o -L/libdir -lstdc 

पहली पंक्ति बस अपने C फ़ाइल से एक वस्तु फ़ाइल बनाता है।

  • स्पष्ट रूप से सूचीबद्ध सभी .o फ़ाइल से जुड़े हुए हैं: दूसरी पंक्ति वस्तु फ़ाइलों को एक साथ खींच, आम तौर पर एक नियम की तरह सेट का पालन करते हुए निष्पादन योग्य बनाता है।
  • एक बार ऐसा करने के बाद, आप अन्य वस्तुओं के लिए पुस्तकालयों को खोजते हैं जो संदर्भित-लेकिन-अनिर्धारित प्रतीकों को पूरा करते हैं।

उदाहरण के लिए, कहें कि prog.c में पंक्ति printf("hello\n"); है। इससे आपकी prog.o फ़ाइल में printf का संदर्भ होगा जो अभी तक संतुष्ट नहीं है।

लिंकर आपके निर्दिष्ट पुस्तकालयों को तब तक खोजेगा जब तक कि वह उस संदर्भ को संतुष्ट न करे। इस मामले में यह रूप /libdir/libstdc.ext की सभी फाइलों को खोज करेंगे जहां:

  • /libdir अपने -L विकल्प (में पुस्तकालयों के लिए खोज करने के लिए एक रास्ता) से है।
  • /lib एक स्थिर है।
  • stdc खोजने के लिए लाइब्रेरी का नाम है (-l से)।
  • ext एक या अधिक एक्सटेंशन (.a, .so, .sl, आदि) है।

एक बार प्रतीक मिलने के बाद, उस ऑब्जेक्ट फ़ाइल को हल करने के लिए लिंक किया गया है। इसके परिणामस्वरूप अधिक जैसे /libdir/libstdc.a(putch.o) के संदर्भ में असंतुष्ट प्रतीकों दिखाई दे सकते हैं।

आपकी विशेष समस्या इस तथ्य के कारण हो सकती है कि आप पुस्तकालयों की खोज के बजाय ऑब्जेक्ट फ़ाइल को सीधे लिंक करने का प्रयास कर रहे हैं। वीएस में ऑब्जेक्ट फाइलों को निर्दिष्ट करने के लिए प्रोजेक्ट विकल्प होना चाहिए, लाइब्रेरी सर्च पथ और लाइब्रेरी नाम (मुझे नवीनतम संस्करणों के लिए यह सुनिश्चित नहीं है लेकिन मुझे पता है कि एमएसवीसी के पुराने संस्करणों में से)।

+0

अच्छी पोस्ट। हालांकि यह एक एमएसवीसी विन्यास मुद्दे की तरह लगता है। –

+0

इसके लिए धन्यवाद, बहुत उपयोगी जानकारी, लेकिन यह मेरी समस्या का समाधान नहीं करती है। मैं * .obj निर्भरता से बचने के लिए एक तरीका जानना चाहता हूं। – Veehmot

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