2013-06-04 36 views
6

Tôi cố gắng để sử dụng Makefile để biên dịch một loạt các .cpp file nằm trong src/code/*.cpp, sau đó biên dịch mỗi *.o trong build/, và cuối cùng tạo ra thực thi với những người trong build/ là tốt.Makefile: Biên dịch từ thư mục khác thư mục

Tôi đã đọc một vài câu trả lời mà tôi đã cố gắng làm việc nhưng gặp phải các vấn đề mà tôi không hiểu.

CC = g++ 
FLAGS = -g -c 

SOURCEDIR = /src/code 
BUILDDIR = build 

EXECUTABLE = DesktopSpecificController 
SOURCES = $(wildcard src/code/*.cpp) 
OBJECTS = $(patsubst src/code/*.cpp,build/%.o,$(SOURCES)) 

all: dir $(BUILDDIR)/$(EXECUTABLE) 

dir: 
    mkdir -p $(BUILDDIR) 

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE) 

tôi làm nhận được lỗi sau đây, và tôi không chắc chắn lý do tại sao:

Makefile:19: target `src/code/main.cpp' doesn't match the target pattern 

Tôi cũng thấy rằng khi cố gắng xây dựng thực thi, nó không được sử dụng các tập tin .o, vì vậy nó dường như quy tắc của tôi sai ở đây.

+0

Chỉ cần cập nhật Makefile một chút. – user1777907

Trả lời

8

Chức năng patsubst của bạn sai; bạn không thể sử dụng các ký tự đại diện shell như *. Bạn muốn:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES)) 

Ngoài ra, bạn nên sử dụng SOURCEDIRBUILDDIR ở khắp mọi nơi, không chỉ ở một số nơi (nếu không bạn sẽ nhận được mâu thuẫn). Và cuối cùng, giá trị SOURCEDIR của bạn sai: không nên bắt đầu bằng / Tôi mong đợi:

SOURCEDIR = src/code 

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp) 
+0

Cảm ơn bạn rất nhiều! Bạn đã khắc phục vấn đề của tôi, nó bây giờ hoạt động :) Cảm ơn rất nhiều! – user1777907

+1

Bạn được chào đón. Đừng quên SO nên là một trong những khu nghỉ dưỡng cuối cùng của bạn, _after_ bạn đã cố gắng để làm việc nó ra cho mình. Dưới đây là một vài gợi ý gỡ lỗi makefile: đầu tiên, tùy chọn '-p' sẽ in toàn bộ cơ sở dữ liệu ra, bao gồm tất cả các giá trị của tất cả các biến. Ngoài ra, trong GNU, bạn có thể sử dụng hàm '$ (info ...)' để in ra các thông tin như các giá trị biến. In những giá trị đó sẽ cho bạn một đầu mối tốt về vấn đề đó. – MadScientist

+2

Để làm rõ đề xuất của MadScientist, '$ (info ...)' có thể được sử dụng như '$ (info $ (SOURCES))', ví dụ. Nó có thể được chèn ngay lập tức sau khi định nghĩa của biến quan tâm. –

Các vấn đề liên quan