2010-07-08 24 views
97

Acabo de heredar un código C++ que fue escrito mal con un archivo cpp que contenía la función principal y muchas otras funciones. También hay archivos .h que contienen clases y sus definiciones de funciones.Usando G ++ para compilar múltiples archivos .cpp y .h

Hasta ahora el programa se compiló usando el comando g++ main.cpp. Ahora que he separado las clases de los archivos .h y .cpp, ¿necesito usar un archivo MAKE o aún puedo usar el comando g++ main.cpp?

Respuesta

135

enumera todos los demás archivos cpp después de main.cpp.

es decir

g++ main.cpp other.cpp etc.cpp 

y así sucesivamente.

O puede compilarlos todos individualmente. A continuación, vincula todos los archivos ".o" resultantes.

+89

Incluso puede hacer 'g ++ * .cpp -o output' – rubenvb

+6

¿Es esto de todos modos una mala práctica? Me gustaría usar esto en mi archivo MAKE. –

+6

@gabriel_vincent, no es necesariamente una mala práctica, pero significará que editar un archivo en un proyecto de cientos hará que el compilador rehaga todo el trabajo para todos los archivos. Compilar por separado permite la compilación incremental. –

7

Puede seguir utilizando g ++ directamente si quieres:

g++ f1.cpp f2.cpp main.cpp 

donde f1.cpp y f2.cpp son los archivos con las funciones que en ella. Para obtener detalles sobre cómo usar make para hacer la compilación, consulte el excelente GNU make documentation.

3

Puede usar varios comandos g ++ y luego vincular, pero lo más fácil es usar un Makefile tradicional o algún otro sistema de compilación: como Scons (que a menudo son más fáciles de configurar que los Makefiles).

16

Ahora que he separado las clases de los archivos .h y .cpp, ¿necesito usar un archivo MAKE o puedo seguir usando el comando "g ++ main.cpp"?

La compilación de varios archivos a la vez es una mala elección si va a poner eso en el archivo Makefile.

Normalmente en un Makefile (por GNU/Make) debería ser suficiente para escribir que:

# "all" is name of the default target, running "make" without params would use it 
all: executable1 

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker 
CC=$(CXX) 

# tell which files should be used, .cpp -> .o make would do automatically 
executable1: file1.o file2.o 

De esa manera make sería adecuadamente recompilar sólo lo que necesita volver a compilar. También se pueden agregar algunos ajustes para generar las dependencias del archivo de encabezado, de modo que make también reconstruya adecuadamente lo que se debe reconstruir debido a los cambios del archivo de encabezado.

2

.h tendrán nada que ver con la compilación ... sólo se preocupan por cpp ... así que el tipo G ++ filename1.cpp filename2.cpp main.cpp -o miprograma

significa que está compilando cada CPP archivos y luego los vinculó en myprgram.

continuación, ejecute el programa de ./myprogram

0

Solía ​​usar un Makefile personalizado que compila todos los archivos en el directorio actual, pero tenía que copiarlo en cada directorio que lo necesitaba, cada vez.

Así que creé mi propia herramienta - Universal Compiler que hizo el proceso mucho más fácil al compilar muchos archivos.

28

Para compilar por separado sin vinculación es necesario añadir la opción -c:

g++ -c myclass.cpp 
    g++ -c main.cpp 
    g++ myclass.o main.o 
    ./a.out 
+0

Tenga en cuenta que si desea controlar el nombre del ejecutable en el paso de vinculación simplemente haga lo que generalmente hace: 'g ++ -o my_executable myclass.o main.o' – neuronet

3

Sé que esta pregunta se ha hecho hace años, pero todavía quería compartir cómo lo general puedo compilar varios archivos de C++.

  1. Digamos que usted tiene 5 cpp, todo lo que tiene que hacer es utilizar el * en lugar de escribir cada uno de los archivos cpp nombrar por ejemplo g ++ -c * .cpp -o miprograma.
  2. Esto generará "miprograma"
  3. ejecutar el programa ./myprogram

eso es todo !!

La razón por la que estoy usando * es que si tienes 30 archivos cpp, ¿escribirías todos? o simplemente use el signo * y ahorre tiempo :)

p.s Utilice este método solo si no le importa el archivo MAKE.

+0

¿Se produce un error de redefinición cuando uso este enfoque? ¿Hay alguna otra forma de hacer lo mismo? –

-3

~/In_ProjectDirectory $ g ++ coordin_main.cpp coordin_func.cpp coordin.h

~/In_ProjectDirectory $ ./a.out

... Trabajado !!

El uso de Linux Mint con Geany IDE

Cuando cada archivo guardado en el mismo directorio, un archivo no se ha guardado correctamente dentro del directorio; el archivo coordin.h Entonces, se volvió a verificar y se guardó allí como coordin.h, y no incorrectamente como -> coordin.h.gch. Las pequeñas cosas Arg !!

+0

Está recibiendo downvoted porque ha incluido archivos h, lo cual es un error. – neuronet

Cuestiones relacionadas