2009-06-16 23 views
24

Hola a todos: pregunta rápida: Estoy en una situación en la que sería útil generar mi ejecutable C++ usando solo 'gcc' (sin g ++). La razón de esto es que tengo que enviar el código a un servidor de envío automático que no reconoce el comando 'g ++' (o 'C++', para el caso).Vinculación del código C++ con 'gcc' (sin g ++)

En mis experimentos, mientras estoy compilando gcc funciona bien. El problema es que, cuando trato de vincular los archivos de objetos generados, se arruina. Ahora, basándome en lo que entendí de la página del manual de gcc (puedo estar muy lejos, así que dime si lo estoy), g ++ es básicamente gcc, pero vincula la biblioteca de C++.

Si esto es cierto, ¿cómo puedo (si es posible) vincular explícitamente la biblioteca C++ sin usando el comando g ++ (o C++)?

EDIT: estoy añadiendo el makefile para ilustrar mejor el problema:

COMPILER = gcc 
CFLAGS = -Wall -g -x c++ 

# MODULE COMPILATION 
model: modules/model.h modules/sources/model.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/model.cpp -o obj/model.o 

algorithms: modules/algorithms.h modules/sources/algorithms.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/algorithms.cpp -o obj/algorithms.o 

io: modules/io.h modules/sources/io.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/io.cpp -o obj/io.o 

stopwatch: modules/stopwatch.h modules/sources/stopwatch.cpp 
    $(COMPILER) $(CFLAGS) -c modules/sources/stopwatch.cpp -o obj/stopwatch.o 

# EXECUTABLE GENERATION 
exe: model algorithms io stopwatch 
    $(COMPILER) $(CFLAGS) main.cpp obj/model.o obj/algorithms.o obj/io.o obj/stopwatch.o -o bin/process 

# DEFAULT TEST CASE 
run: exe 
    ./bin/process -i data/nasa_small.log -a data/nasa_small.access -s data/nasa_small.stack 

# CLEANING ROUTINE 
clean: 
    rm -f obj/* 
+0

gcc y g ++ apuntan literalmente al mismo ejecutable. La única diferencia son las banderas pasadas al back-end. –

+0

¡Solucione el servidor de envío automático! –

+0

No era una opción = D –

Respuesta

41

puede vincular el ++ biblioteca estándar de C con la bandera -l a gcc:

gcc cplusplus.o -lstdc++ -o myexe 
+0

Esto funciona muy bien, no sabía el nombre de la biblioteca para vincularlo. –

+0

He estado utilizando esta técnica con éxito durante años. Pero acabo de actualizar a Ubuntu 11.10 (gcc 4.6.1) y ha dejado de funcionar. Ahora recibo una referencia "indefinida al operador' nuevo (sin signo largo) '"error en varias máquinas. ¿Ha surgido este problema para alguien más? – mgiuca

+1

Oh, no importa. Es porque he estado poniendo -lstdC++ antes del archivo o. Las versiones más nuevas de GCC parecen requerir que coloque bibliotecas después de los archivos o. – mgiuca

13

Si ejecuta g ++ con la opción "-v", se mostrará qué comando y opciones utiliza. Debería poder deducir la línea de comando correcta de gcc desde allí.

+0

¡También una gran solución! –

Cuestiones relacionadas