Mam wspólny kod (na przykład hello.cpp
) używany przez wiele plików wykonywalnych. Używam jednego Makefile to wszystko budować:Pomóż uprościć plik Makefile dla wielu plików wykonywalnych
EXE=app1.out app2.out
SRC=hello.cpp
OBJ=$(SRC:.cpp=.o)
SRC_MAIN=app1.cpp app2.cpp
OBJ_MAIN=$(SRC_MAIN:.cpp=.o)
all: $(EXE)
app1.out: app1.o $(OBJ)
g++ $< $(OBJ) -o [email protected]
app2.out: app2.o $(OBJ)
g++ $< $(OBJ) -o [email protected]
.cpp.o:
g++ -c $< -o [email protected]
clean:
rm -f $(EXE) $(OBJ) $(OBJ_MAIN)
nie jestem bardzo zadowolony z posiadania odrębnej cel dla każdego pliku wykonywalnego - cele są zasadniczo takie same. Czy jest jakiś sposób na zrobienie tego z jednym celem dla wszystkich plików wykonywalnych? Miałem nadzieję, że coś jak to będzie działać:
EXE=app1.out app2.out
SRC=hello.cpp
OBJ=$(SRC:.cpp=.o)
SRC_MAIN=app1.cpp app2.cpp
OBJ_MAIN=$(SRC_MAIN:.cpp=.o)
all: $(EXE)
.o.out: $(OBJ)
g++ $< $(OBJ) -o [email protected]
.cpp.o:
g++ -c $< -o [email protected]
clean:
rm -f $(EXE) $(OBJ) $(OBJ_MAIN)
Ale dostaję łączący błąd:
[email protected]:~/cpp/stack$ make -f Makefile2
g++ -c app1.cpp -o app1.o
g++ app1.o hello.o -o app1.out
g++: hello.o: No such file or directory
make: *** [app1.out] Error 1
rm app1.o
Z jakiegoś powodu stara się budować app1.out
bez buduje swoją zależność hello.o
. Czy ktoś może wyjaśnić, dlaczego to nie działa i sugerować coś, co robi?
Oto reszta manekina, na wszelki wypadek.
app1.cpp:
#include "hello.h"
int
main(void)
{
print_hello();
}
app2.cpp:
#include "hello.h"
int
main(void)
{
for (int i = 0; i < 4; ++i)
print_hello();
return 0;
}
hello.cpp:
#include "hello.h"
#include <stdio.h>
void
print_hello()
{
printf("hello world!\n");
}
hello.h:
#ifndef HELLO_H
#define HELLO_H
void
print_hello();
#endif
Dzięki za odpowiedź. Używam reguły .cpp do .o do dostarczania niestandardowego 'CPPFLAGS' do kompilatora. Nie pokazałem ich w przykładowym kodzie, ponieważ zachowałem prostotę. Czy wartości domyślne 'make' nadal zawierają" domyślne "nazwy zmiennych (np.' CFLAGS', 'CPPFLAGS',' LDFLAGS', itd.)? – misha
Tak, ale 'CPPFLAGS' jest dla pre-procesora C. 'CXXFLAGS' jest dla flag C++. –