2012-11-14 12 views
21

Rozważ to MakefileDomyślne ustawienie łącznika w Makefile do łączenia C++ obiektu pliki

% cat Makefile 
main: main.o add.o 

który wykorzystuje cc zamiast g++ powiązać pliki obiektowe

% make 
g++ -Wall -pedantic -std=c++0x -c -o main.o main.cpp 
g++ -Wall -pedantic -std=c++0x -c -o add.o add.cpp 
cc main.o add.o -o main 
main.o:main.cpp:(.text+0x40): undefined reference to `std::cout' 
... 

Jak mam powiedzieć (GNU) Dodać do użyć g++ (która łączy biblioteki C++) zamiast cc?

Odpowiedz

27

(GNU) Marka posiada wbudowane zasad, co jest miłe, ponieważ wystarczy podać zależności bez zasad:

main: main.o add.o 
    # no rule, therefore use built-in rule 

Jednak zasada wbudowany w tym przypadku wykorzystuje $(CC) do łączenia plików obiektowych .

% make -p -f/dev/null 
... 
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH) 
... 
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) 
... 
%: %.o 
# recipe to execute (built-in): 
     $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

Aby pozwolić Producent wybrał właściwy łącznik, wystarczy ustawić LINK.o do LINK.cc. Minimalny numer Makefile może więc wyglądać tak, jakby:

% cat Makefile 
LINK.o = $(LINK.cc) 
CXXFLAGS=-Wall -pedantic -std=c++0x 

main: main.o add.o 
Powiązane problemy