2012-10-05 12 views
15

Robię C++ Shared Library i kiedy mogę skompilować główny exe, który wykorzystuje bibliotekę kompilator daje mi:C++ biblioteki współdzielonej niezdefiniowana odniesienia do `FooClass :: sayHello()”

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

Code Library :

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"; 
} 

Kompilacja z:

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

Menem: 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; 
} 

Kompilacja z:

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

Maszyna jest Linux Ubuntu 12

Dzięki!

+2

Biblioteki na końcu komendy kompilatora. Zobacz http://stackoverflow.com/questions/9966959/noobish-linker-errors-when-compiling-against-glib/9966989#9966989 – hmjd

+0

Nie pisz do strażników (lub innych nazw), które zawierają dwa podkreślenia lub zaczynają się od podkreślenie poprzedzone wielką literą. Te nazwy są zarezerwowane dla implementacji. (To prawdopodobnie nie ma nic wspólnego z właściwą odpowiedzią na pytanie) –

+0

@close voters: Myślę, że to pytanie jest lepsze od drugiego (po pierwsze, tytuł nie jest opisowy, a po drugie, tamten ma tonę obcej śmieci) – Wug

Odpowiedz

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

to problem. Ostatnie wersje GCC wymagają umieszczenia plików obiektów i bibliotek w kolejności, w jakiej są od siebie zależne - jako konsekwentna reguła, musisz umieścić flagi biblioteki jako ostatni przełącznik dla linkera; ja. napisz zamiast tego:

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

.

+0

Dzięki! to rozwiązało problem. – fivunlm

+3

Każdy pomysł, jak możemy to określić za pomocą qmake? –

+0

Dobra odpowiedź! Od dłuższego czasu nie robię tego ręcznie za pomocą przykładowego projektu cmdline. A teraz spędzam 1 godzinę próbując dowiedzieć się, co to znaczy "nieokreślone odniesienie" podczas kompilowania projektu za pomocą gcc-6. Problem polegał na tym, że opisałeś to tutaj! – bruziuz

Powiązane problemy