2012-11-14 98 views
21

考慮這個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)請對使用g++(鏈接C++庫)而不是cc

回答

27

(GNU)使具有內置的規則,這是很好的,因爲它足以讓依賴無規則:

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] 

爲了讓製作選擇了正確的連接,就足夠了設置LINK.oLINK.cc。最小Makefile因此可以看起來像

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

main: main.o add.o