29

考虑这个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 to use g++(链接 C++ 库) 而不是cc

4

1 回答 1

38

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

要让 Make 选择正确的链接器,设置LINK.oLINK.cc. 因此,最小Makefile可以看起来像

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

main: main.o add.o
于 2012-11-14T08:36:18.520 回答