2011-09-17 42 views
1

我試圖把一個makefile文件放在一起,它將從一個目錄(例如,src)中獲取源文件,將它們編譯到另一個目錄中的目標文件中(例如,build)然後將這些文件從主目錄中創建一個靜態庫。在不同目錄中有源文件和目標文件的自動生成文件

這裏是我的努力迄今:

LIBNAME := test 
LIBNAME := lib$(LIBNAME).a 

CC = g++ 
CFLAGS := -O0 -Wall -g -fPIC 
INCLUDE := include 
SOURCE := src 
BUILD := build 

CPPFILES := $(foreach dir, $(SOURCE)/, $(notdir $(wildcard $(SOURCE)/*.cpp))) 
OBJFILES := $(addprefix $(BUILD)/, $(CPPFILES:.cpp=.o)) 

all: $(LIBNAME) $(OBJFILES) 

$(LIBNAME): $(OBJFILES) 
    ar rcs $(LIBNAME) $(OBJFILES) 

.cpp.o: 
    $(CC) $(CFLAGS) -I$(INCLUDE) -c $< -o [email protected] 

clean: 
    rm -rf $(BUILD) 

,給了我這樣的:

make: *** No rule to make target `build/point.o', needed by `libtest.a'. Stop 

回答

3

你似乎被要求使用GNU make反正(的foreach功能),因此重寫舊式後綴規則.cpp.o到

$(BUILD)/%.o : $(SOURCE)/%.cpp 

應該這樣做。您也可以嘗試使用VPATH變量或vpath指令,請參閱這些的make手冊。

一般來說,你可能只需要用automake來解決這個問題,它爲你做了大部分的工作。

相關問題