2012-09-19 126 views
2

我正在嘗試創建一個名爲A.a的庫,它提供了一個類A,它依賴於類B和C,它們都在其各自的文件(.cpp.hpp)中。我通常手動編譯我的所有代碼,但隨着文件數量的增加,我想使用makefile。基本上,我會做的是:如何用Gnu製作圖書館?

g++ -c A.cpp 
g++ -c B.cpp 
g++ -c C.cpp 
ar rvs A.a *.o 

我怎樣才能構建一個這樣做的生成文件?甚至可以打電話給ar

這是我的嘗試:

CC=g++ 
CFLAGS=-c -Wall 
objects=C.o B.o 

all : A.o $(objects) #Creates the library called A.a. 
:ar rvs A.a A.o $(objects) 

A.o : $(objects) A.hpp A.cpp 
:$(CC) $(CFLAGS) A.cpp 

B.o : B.hpp B.cpp 
:$(CC) $(CFLAGS) B.cpp 

C.o : C.hpp C.cpp 
:$(CC) $(CFLAGS) C.cpp 

但似乎我的ar rvs A.a A.o $(objects)指令未執行,甚至。該生成文件會生成所有正確的.o文件,但不會將其歸檔。

+0

首先,包含的命令來建立一個目標線必須用製表符前綴。其次,我不確定命令的':'前綴應該做什麼 - 我知道'@'和' - '前綴,但我從來沒有見過':'。除此之外,它看起來應該工作... – twalberg

+0

':'可以使用一個選項卡,正如Gnu官方網站上所述。另外,您可以使用目標:依賴關係; recepy。 – corazza

+0

有趣的......我諮詢的信息文件沒有包含這個小事實(至少不在明顯的位置)。今天有我的「學習新東西」...... – twalberg

回答

1

好了,我的語法是正確畢竟,或者至少,它的一個重要部分了。我帶着一個錯誤的前提,:可以取代標籤,顯然,這是不正確的。

所以,這是該代碼,我想要做什麼:

CC=g++ 
CFLAGS=-c -Wall 
objects=B.o C.o 

all : A.a 

A.o : $(objects) A.hpp A.cpp 
    $(CC) $(CFLAGS) A.cpp 

B.o : B.hpp B.cpp 
    $(CC) $(CFLAGS) B.cpp 

C.o : C.hpp C.cpp 
    $(CC) $(CFLAGS) C.cpp 

A.a : A.o $(objects) 
    ar rvs A.a A.o $(objects) 
3

您可以使用規則和模式,使之更加通用:

SRC_DIR = . 
CPPFLAGS += -g 
INCLUDES = -I. 

# variant 1 
SRCS ?= $(shell find $(SRC_DIR) -name '*.cpp' | sed "s/[^\/]*\/[^\/]*\///") 
# variant 2 
SRCS = A.cpp B.cpp 

%.o : $(SRC_DIR)/%.cpp 
    $(CXX) -o [email protected] $(INCLUDES) $(CPPFLAGS) -c $^ 

all : A.a 

A.a : $(SRCS:.cpp=.o) 
    $(AR) rsv [email protected] $^