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?

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.


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

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.


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 .


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.


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


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.


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).


2

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

g++ *.cpp -I. -o out

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.


-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 !!


3
Te están rechazando porque has incluido archivos h, lo cual es un error.
Eric
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.