2012-10-05 2 views
15

Sto facendo una libreria condivisa C++ e quando compilo un exe principale che utilizza la libreria il compilatore mi dà:C++ libreria condivisa undefined reference to `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"; 
} 

compilazione con:

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

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

compilazione con:

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

La macchina è un'Ubuntu Linux 12

Grazie!

+2

Librerie alla fine del comando del compilatore. Vedi http://stackoverflow.com/questions/9966959/noobish-linker-errors-when-compiling-against-glib/9966989#9966989 – hmjd

+0

Non scrivere include guardie (o altri nomi) che contengono due caratteri di sottolineatura o iniziano con un trattino basso seguito da una lettera maiuscola. Quei nomi sono riservati all'implementazione. (Questo probabilmente non ha nulla a che fare con la giusta risposta alla domanda) –

+0

@close elettori: Penso che questa domanda sia migliore dell'altra (in primo luogo, il titolo non è descrittivo, e in secondo luogo, l'altro ha un sacco di spazzatura estranea) – Wug

risposta

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

è il problema. Le versioni recenti di GCC richiedono che si inseriscano i file oggetto e le librerie nell'ordine in cui dipendono l'uno dall'altro: come regola empirica, è necessario inserire i flag della libreria come ultimo switch per il linker; io. e., scrivere

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

invece.

+0

Grazie! questo ha risolto il problema. – fivunlm

+3

Qualche idea su come possiamo specificarlo usando qmake? –

+0

Buona risposta! Per molto tempo non eseguo manualmente il progetto di esempio di compilazione di cmdline. E in questo momento trascorro 1 ora cercando di capire cosa significa "riferimento non definito" durante la compilazione del progetto con gcc-6. Il problema era in quello che hai descritto qui! – bruziuz