2012-03-20 17 views
7

Ahora estoy estudiando C++. Quiero un archivo MAKE que compile todos los archivos cpp en el directorio actual para separar ejecutables. Por ejemplo:Makefile que compila todos los archivos cpp en un directorio en un ejecutable independiente

En un directorio hay 3 archivos C++, tales como examp1.cpp, examp2.cpp y examp3.cpp. Quiero un makefile que compilar y enlazar y dar examp1.exe, examp2.exe y examp3.exe

He creado un script bash para compilar todos ellos y crear archivos EXE pero creo; esa no es la forma exacta de hacer esto.

Tengo un Makefile para ".c", pero parece que no funciona aquí. Solo crea archivos de objetos y no los vincula. Es como sigue:

SRCS=$(wildcard *.c) 
OBJS=(SRCS:.c=.o) 
all: $(OBJS) 

El código anterior compila todos los archivos nuevos y modificados ".c" a los ficheros ".o" con el mismo nombre en el directorio actual.

La escritura del golpe que estoy utilizando para crear ejecutables es la siguiente:

for i in ./*.cpp 
do 
    g++ -Wno-deprecated $i -o `basename $i .cpp`".exe" 
done 

Esto significa que quiero lo que sea "archivos .cpp" que puse en ese directorio, mediante el uso de un simple 'hacer todo' o cualquier cosa así debería compilarse

+4

¿Has intentado alguna vez crear el archivo MAKE? Si es así, publíquelo para que podamos ayudarlo. Hay [documentación] (http://www.gnu.org/software/make/manual/make.html) disponible para comenzar. – Joe

+1

Las versiones de make varían de un proveedor a otro. ¿Qué marca estás usando? ¿Estás usando GNU Make en Linux? Microsoft Make en Windows/Visual C++? –

+1

¿Ha intentado escribir un archivo MAKE que compile * un * archivo fuente y produzca un ejecutable? – Beta

Respuesta

16

Un Makefile mínima que hace lo que quiere serían:

#Tell make to make one .out file for each .cpp file found in the current directory 
all: $(patsubst %.cpp, %.out, $(wildcard *.cpp)) 

#Rule how to create arbitary .out files. 
#First state what is needed for them e.g. additional headers, .cpp files in an include folder... 
#Then the command to create the .out file, probably you want to add further options to the g++ call. 
%.out: %.cpp Makefile 
    g++ $< -o [email protected] -std=c++0x 

que tendrá que reemplazar g ++ por el compilador que está utilizando y posiblemente ajustar un cierto ajuste específico de la plataforma, pero el propio Makefile debería funcionar .

+0

Al usar este Makefile; por ejemplo, si tengo un archivo "hello.cpp", tengo que usar "hacer hola".out ", pero estoy preguntando si utilizo" make all "compilará" hello.cpp "a" hello.out ". Aquí cuando utilizo el Makefile anterior me aparece" No hay nada que hacer para todos " – kaushik

+0

¿Has probado? xD Especifica en la segunda línea que el comando make all necesita un archivo .out para cada archivo .cpp que se encuentra en el directorio. Por lo tanto, una llamada para hacer todo dará como resultado una llamada, por ejemplo, make hello.out, make bye .out, y así sucesivamente. Claro que también puede usar make hello.out ya que se especifica la regla, pero no es necesario. – Haatschii

+0

Ok, intente una vez más, olvidé poner $ (comodín * .cpp) en el todas las reglas. Ahora debería funcionar como se esperaba. – Haatschii

1

El más simple Makefile puede crear eso podría funcionar para usted es la siguiente:

all: examp1.exe examp2.exe examp3.exe 

que va a utilizar reglas predeterminadas de maquillaje para crear sus tres programas.

3

Este es el Makefile que utilizo

CC = gcc 
CFLAGS = -g -O2 -std=gnu99 -static -Wall -Wextra -Isrc -rdynamic -fomit-frame-pointer 
all: $(patsubst %.c, %.out, $(wildcard *.c)) 
%.out: %.c Makefile 
    $(CC) $(CFLAGS) $< -o [email protected] -lm 
clean: 
    rm *.out      

Debe pegarlo en algún lugar de su casa y cada vez que cambie el dirctory simplemente copiarlo allí. Yo uso un alias en mi ~/.basrc para copiarlo

alias get_makefile_here='cp ~/Makefile ./' 

Simplemente presione make y bam, ya está hecho. También note el hecho de que una vez que haya terminado con los archivos viejos, no reconstruirá su ejecutable.

Cuestiones relacionadas