Usando G ++ para compilar múltiples archivos .cpp y .h

172

Acabo de heredar un código C ++ que se escribió mal con un archivo cpp que contenía las funciones principales y muchas otras. También hay .harchivos que contienen clases y sus definiciones de funciones.

Hasta ahora, el programa se compilaba usando el comando g++ main.cpp. Ahora que separé las clases .hy los .cpparchivos, ¿necesito usar un archivo MAKE o todavía puedo usar el g++ main.cppcomando?

Meir
fuente

Respuestas:

224

enumere todos los otros archivos cpp después de main.cpp.

es decir

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

y así.

O puede compilarlos todos individualmente. Luego vincula todos los archivos ".o" resultantes.

Goz
fuente
152
Incluso puedes hacerlog++ *.cpp -o output
rubenvb
77
¿De todos modos es una mala práctica? Me gustaría usar esto en mi archivo MAKE.
gabriel_vincent
8
@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 una compilación incremental.
Paul Draper
@gabriel_vincent Para empezar, no deberías escribir makefiles a mano. Utilice un sistema de compilación adecuado como CMake en su lugar.
Baum mit Augen
3
@BaummitAugen Sí, excepto que solo quiero compilar este pequeño programa de 2 archivos que he escrito en 14 minutos, y realmente preferiría pasar 1 minuto escribiendo un archivo MAKE en lugar de una hora configurando cmake.
Przemek D
55

Para compilar por separado sin vincular, debe agregar la -copción:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
FredAKA
fuente
3
Tenga en cuenta que si desea controlar el nombre del ejecutable en el paso de vinculación, simplemente haga lo que suele hacer:g++ -o my_executable myclass.o main.o
Eric
22

Ahora que separé las clases en archivos .h y .cpp, ¿necesito usar un archivo MAKE o puedo seguir usando el comando "g ++ main.cpp"?

Compilar varios archivos a la vez es una mala elección si va a poner eso en el Makefile.

Normalmente en un Makefile (para GNU / Make ) debería ser suficiente 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, se recompilaría correctamente solo lo que se debe volver a compilar. También se pueden agregar algunos ajustes para generar las dependencias del archivo de encabezado, por lo que make también reconstruiría correctamente lo que debe reconstruirse debido a los cambios en el archivo de encabezado.

Dummy00001
fuente
13

Todavía puedes usar g ++ directamente si quieres:

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

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


fuente
12

Sé que esta pregunta se hizo hace años, pero todavía quería compartir cómo suelo compilar múltiples archivos de C ++.

  1. Digamos que tiene 5 archivos cpp, todo lo que tiene que hacer es usar * en lugar de escribir el nombre de cada archivo cpp Eg g++ -c *.cpp -o myprogram.
  2. Esto generará "myprogram"
  3. ejecuta el programa ./myprogram

¡¡eso es todo!!

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

ps Use este método solo si no le importa el archivo MAKE.

zobair
fuente
1
¿Se produce un error de redefinición cuando uso este enfoque? ¿Hay otra forma de hacer lo mismo?
Waseem Ahmad Naeem
11

.h los archivos no tendrán nada que ver con la compilación ... solo te interesan los archivos cpp ... así que escribe g++ filename1.cpp filename2.cpp main.cpp -o myprogram

significa que está compilando cada archivo cpp y luego los ha vinculado en myprgram.

luego ejecuta tu programa ./myprogram

Mateo
fuente
7

Como dijo rebenvp , usé:

g++ *.cpp -o output

Y luego haga esto para la salida:

./output

Pero una mejor solución es usar el makearchivo. Lea aquí para saber más sobre makearchivos.

También asegúrese de haber agregado los .harchivos necesarios en los .cpparchivos.

Pritam Banerjee
fuente
4

Puede usar varios comandos de 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).

Gauteh
fuente
2

Si desea usar #include <myheader.hpp>dentro de sus archivos cpp puede usar:

g++ *.cpp -I. -o out
Matias Haeussler
fuente
1

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

Así que creé mi propia herramienta: Universal Compiler, que facilitó mucho el proceso al compilar muchos archivos.

Shubham Chaudhary
fuente
-4

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

~ / In_ProjectDirectory $ ./a.out

... ¡¡Trabajó!!

Usando Linux Mint con Geany IDE

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

Tim Conroy
fuente
3
Te están rechazando porque has incluido archivos h, lo cual es un error.
Eric