2012-10-05 8 views
15

मैं एक सी ++ साझा लाइब्रेरी बना रहा हूं और जब मैं एक मुख्य exe पुस्तकालय का उपयोग करता है संकलक मुझे देता संकलन:सी ++ `FooClass :: SayHello को साझा लाइब्रेरी अपरिभाषित संदर्भ() '

main.cpp:(.text+0x21): undefined reference to `FooClass::SayHello()' 
collect2: ld returned 1 exit status 

लाइब्रेरी कोड :

fooclass.h

#ifndef __FOOCLASS_H__ 
#define __FOOCLASS_H__ 

class FooClass 
{ 
    public: 
     char* SayHello(); 
}; 

#endif //__FOOCLASS_H__ 

fooclass.cpp

#include "fooclass.h" 

char* FooClass::SayHello() 
{ 
    return "Hello Im a Linux Shared Library"; 
} 

साथ संकलन:

g++ -shared -fPIC fooclass.cpp -o libfoo.so 

मुख्य: main.cpp

#include "fooclass.h" 
#include <iostream> 

using namespace std; 

int main(int argc, char const *argv[]) 
{ 
    FooClass * fooClass = new FooClass(); 

    cout<< fooClass->SayHello() << endl; 

    return 0; 
} 

साथ संकलन:

g++ -I. -L. -lfoo main.cpp -o main 

मशीन एक उबंटू लिनक्स 12

धन्यवाद है!

+2

कंपाइलर कमांड के अंत में पुस्तकालय। Http://stackoverflow.com/questions/9966959/noobish-linker-errors-when-compiling-against-glib/9966989#9966989 – hmjd

+0

लिखना न लिखें गार्ड (या कोई अन्य नाम) जिसमें दो अंडरस्कोर होते हैं या साथ शुरू होते हैं एक अंडरस्कोर एक पूंजी पत्र के बाद। वे नाम कार्यान्वयन के लिए आरक्षित हैं। (संभवतः इस प्रश्न के सही उत्तर के साथ कुछ भी करने की ज़रूरत नहीं है) –

+0

@ क्लोज मतदाता: मुझे लगता है कि यह प्रश्न दूसरे की तुलना में बेहतर है (सबसे पहले, शीर्षक वर्णनात्मक नहीं है, और दूसरा, दूसरे में एक बाहरी जंक का एक टन है) – Wug

उत्तर

27
g++ -I. -L. -lfoo main.cpp -o main 

समस्या है। जीसीसी के हाल के संस्करणों की आवश्यकता है कि आप वस्तु फ़ाइलों और पुस्तकालयों को एक दूसरे पर निर्भर करते हैं - अंगूठे के परिणामी नियम के रूप में, आपको लाइब्रेरी ध्वज को लिंकर के लिए अंतिम स्विच के रूप में रखना होगा; मैं। ई।,

g++ -I. -L. main.cpp -o main -lfoo 

इसके बजाय लिखें।

+0

धन्यवाद! जिसने समस्या हल की। – fivunlm

+3

कोई विचार है कि हम qmake का उपयोग करके इसे कैसे निर्दिष्ट कर सकते हैं? –

+0

अच्छा जवाब! लंबे समय तक मैं cmdline बिल्ड नमूना प्रोजेक्ट के माध्यम से मैन्युअल रूप से नहीं करता हूं। और फिलहाल मैं यह समझने की कोशिश कर रहा हूं कि जीसीसी -6 के साथ प्रोजेक्ट संकलन के दौरान इसका मतलब क्या है "अनिर्धारित संदर्भ"। समस्या यह थी कि आपने यहां वर्णित किया था! – bruziuz

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