2012-06-04 21 views
7

Tengo este problema donde el compilador de GCC parece estar fallando cuando se trata de vincular dos archivos de objetos que tengo juntos. Ambos archivos de objeto foo1.cc y foo2.cc incluyen clases de un archivo de encabezado llamado foo1.hh. Además, el archivo de encabezado foo.hh tiene como una declaración externa de una instancia de objeto que aparece en foo1.cc.¿Cómo compilar y vincular archivos de objeto en C++ usando el mismo archivo de encabezado?

Se debe tener en cuenta que el archivo de encabezado foo.hh solo se definirá una vez entre los dos archivos de origen foo1.cc y foo2.cc.

Cuando puedo compilar los archivos de código fuente utilizando el siguiente comando, todo parece funcionar:

g++ foo1.cc foo2.cc 

El comando anterior producirá un ejecutable llamado a.out.

Cuando intento compilar los archivos de origen en los ficheros objeto independiente:

g++ -c foo1.cc 
g++ -c foo2.cc 
g++ -o foo1.o foo2.o 

El compilador GCC se queja de que hay referencias indefinidas a funciones en foo2.cc. Estas funciones deben definirse en foo1.cc; sin embargo, el enlazador no reconoce eso.

Me preguntaba si había una forma de evitar este problema con el compilador de GCC.

+0

Bienvenido a SO! Asegúrese de aceptar la respuesta más útil. – jncraton

+0

debes aceptar una respuesta. – Walter

Respuesta

8

No hay problema, tiene un error en la sintaxis de gcc.

g++ -c foo1.cc 
g++ -c foo2.cc 
g++ -o foo foo1.o foo2.o 

el parámetro -o acepta el nombre del archivo de salida, por lo que en su caso, sería sobrescribir foo1.o con resultado de vinculación.

3

Su último comando que es el comando de enlace dice: crea un ejecutable de foo2.o y nombra el ejecutable foo1.o. Es probable que el enlazador no encuentre toda la información que necesita para crear el ejecutable, ya que su intención era usar tanto foo1.o como foo2.o. Simplemente omita la bandera -o:

g++ foo1.o foo2.o 
Cuestiones relacionadas