Pytanie Domyślne ustawienie linkera w Makefile do łączenia plików obiektów C ++


Rozważ to Makefile

% cat Makefile
main: main.o add.o

który używa cc zamiast g++ połączyć pliki obiektów

% 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) Make to use g++ (który łączy biblioteki C ++) zamiast cc?


21
2017-11-14 08:36


pochodzenie




Odpowiedzi:


(GNU) Make ma wbudowane reguły, co jest miłe, ponieważ wystarczy podać zależności bez reguł:

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

Jednak reguła wbudowana w tym przypadku używa $(CC) do łączenia plików obiektów.

% 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 $@

Aby Make mógł wybrać poprawny linker, wystarczy ustawić LINK.o do LINK.cc. Minimalny Makefile może więc wyglądać

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

main: main.o add.o

28
2017-11-14 08:36