Подтвердить что ты не робот

Установка компоновщика по умолчанию в Makefile для связывания объектных файлов С++

Рассмотрим это Makefile

% cat Makefile
main: main.o add.o

который использует cc вместо g++ для связывания объектных файлов

% 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'
...

Как я могу сказать (GNU) Make использовать g++ (который связывает библиотеки С++) вместо cc?

4b9b3361

Ответ 1

(GNU) Make имеет встроенные правила, что приятно, потому что достаточно предоставить зависимости без правил:

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

Однако правило сборки в этом случае использует $(CC) для связывания объектных файлов.

% 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]

Чтобы Make выбрал правильный компоновщик, достаточно установить LINK.o на LINK.cc. Таким образом, минимальный Makefile может выглядеть как

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

main: main.o add.o