2012-10-05 36 views
15

estoy haciendo una biblioteca compartida de C++ y cuando compilo un exe principal que utiliza la biblioteca del compilador me da:C++ biblioteca compartida referencia indefinida a `FooClass :: SayHello()'

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

código de la biblioteca :

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

Compilar con:

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

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

Compilar con:

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

La máquina es un Ubuntu Linux 12

Gracias!

+2

Bibliotecas al final del comando del compilador. Consulte http://stackoverflow.com/questions/9966959/noobish-linker-errors-when-compiling-against-glib/9966989#9966989 – hmjd

+0

No escriba incluya guardias (u otros nombres) que contengan dos guiones bajos o comience con un guión bajo seguido de una letra mayúscula. Esos nombres están reservados a la implementación. (Esto probablemente no tiene nada que ver con la respuesta correcta a la pregunta) –

+0

@close votantes: creo que esta pregunta es mejor que la otra (primero que nada, el título no es descriptivo, y el segundo de todos, el otro tiene una tonelada de basura extraña) – Wug

Respuesta

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

es el problema. Las versiones recientes de GCC requieren que coloque los archivos de objetos y las bibliotecas en el orden en que dependen el uno del otro: como regla general consecuente, debe colocar los indicadores de la biblioteca como el último interruptor para el vinculador; yo. e., escriba

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

en su lugar.

+0

¡Gracias! eso resolvió el problema – fivunlm

+3

¿Alguna idea de cómo podemos especificar esto usando qmake? –

+0

¡Buena respuesta! Durante mucho tiempo no lo hago manualmente a través de un proyecto de ejemplo de construcción de cmdline. Y en este momento dedico una hora tratando de entender qué significa "referencia indefinida" durante la compilación del proyecto con gcc-6. ¡El problema estaba en que describiste aquí! – bruziuz

Cuestiones relacionadas