2009-11-08 23 views
26

corté & pegado el código de abajo de a previous question en un archivo llamado "avishay.cpp" y luego corrió¿Cómo compilar C++ en Ubuntu Linux?

gcc avishay.cpp 

sólo para obtener los siguientes mensajes de error del enlazador. ¿Qué salió mal? ¿Qué debería haber hecho?

[email protected]:~/Projects/StackOverflow$ gcc -static avishay.cpp 
/tmp/cccRNW34.o: In function `__static_initialization_and_destruction_0(int, int)': 
avishay.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()' 
avishay.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()' 
/tmp/cccRNW34.o: In function `A::func()': 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x11): undefined reference to `std::cout' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x16): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x1e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x26): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x36): undefined reference to `std::cout' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x3b): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)' 
/tmp/cccRNW34.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' 
collect2: ld returned 1 exit status 

El código C++ (no es mi código, yo sólo estaba tratando de ejecutarlo):

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    int _dmember; 

public: 
    void func() 
    { 
    cout<<"Inside A!! "<<endl; 
    cout<<_dmember; // crash when reach here. 
    } 
}; 

int main() 

{ 

    A* a= NULL; 

    a->func(); // prints "Inside A!!!" 

    return 1; 
} 
+0

Duplicado de http://stackoverflow.com/q/203548/981959 –

Respuesta

67

Debe utilizar g++, no gcc, para compilar programas en C++.

Para este programa en particular, que acaba de escribir

make avishay 

y vamos make averiguar el resto. Le da a su ejecutable un nombre decente, también, en lugar de a.out.

+3

¡Qué estúpido de mí! Muchas gracias. –

+5

Otro +1 (si pudiera) para la sugerencia "hacer". ¡Nunca supe que hacer podría/haría eso! –

+1

+1 por hacer! <3 –

11

Probablemente deberías usar g ++ en lugar de gcc.

+7

Gracias. Ayer mismo no sabía cómo deletrear "Programador de C++" y hoy soy uno! –

4

g ++ es el compilador de C++ en Linux. El código se ve bien Es posible que se echa en falta una referencia de la biblioteca que se utiliza como tal:

g ++ -l {nombre de la biblioteca aquí (FNS matemáticas utilice "m")} codefile.cpp

2

Utilice g ++. Y asegúrese de tener las bibliotecas relevantes instaladas.

+0

Pagué un buen dinero por Ubuntu ... oh espera, ¡No lo hice! Pero sí, resultó que el problema estaba en cómo llamé al compilador. –

9

Sí, use g ++ para compilar. Automáticamente agregará todas las referencias a libstdC++ que son necesarias para vincular el programa.

g++ source.cpp -o source 

Si se omite el parámetro -o, el ejecutable resultante se llamará a.out. En cualquier caso, los permisos ejecutables ya se han establecido, por lo que no es necesario chmod nada.

Además, el código le dará un comportamiento indefinido (y probablemente un SIGSEGV) ya que está desreferenciando un puntero NULL e intentando llamar a una función miembro en un objeto que no existe, por lo que seguramente no imprimirá nada . Probablemente se bloqueará o hará algún baile funky.

+0

Sí, el código era parte de otra pregunta (vinculada) y obtuvo su merecido castigo allí. Para una prueba rápida, no No me importa que el programa se llame a.out, y yo sabía acerca de -o. Mi principal problema era con el nombre del compilador, gracias ! –

4

Uso

g ++

espacio seguido por el nombre del programa. por ejemplo:

g++ prog.cpp

si el nombre de archivo era "prog.cpp" en este caso. si desea ejecutar el programa de escritura:

./prog 

así que utilicé

"PROG"

porque era mi nombre.

+1

El archivo de salida será "a.out" a menos que use la bandera '-o' – Kookerus

4

incluso usted puede compilar su código de C++ por gcc ¿Suena gracioso? Sí lo es. probarlo

$ gcc avishay.cpp -lstdc++ 

disfrutar

5

actualización de su apt-get:

$ sudo apt-get update 
$ sudo apt-get install g++ 

ejecutar su program.cpp:

$ g++ program.cpp 
$ ./a.out 
+0

Fuera de las otras respuestas, esta es más clara y al grano. Muchas gracias . – harrypotter0

1

puede utilizar g ++ --std = C++ 0x example.cpp -o ejemplo

1

Recopilar source.cpp, ejecute

g++ source.cpp 

Este comando compilará source.cpp para presentar a.out en el mismo directorio . para ejecutar el archivo compilado, ejecute

./a.out 

Si compila otro archivo de origen, con g++ source2.cpp, el nuevo archivo compilado a.out sobrescribirá el a.out generado con source.cpp

Si desea compilar source.cpp a una específica archivo, compiledfile decir, plazo

g++ source.cpp -o compiledfile 

o

g++ -o compiledfile source.cpp 

Esto creará el compiledfile que es el archivo binario compilado. para ejecutar el compiledfile, ejecute

./compiledfile 

Si no es g++ en su $PATH, reemplace g ++ con /usr/bin/g++.

Cuestiones relacionadas