2016-02-03 20 views
5

Tôi hiện đang làm việc thông qua một sách giáo khoa C++; Tôi muốn có thư mục riêng cho các bài tập trong cuốn sách, và một makefile đơn trong thư mục gốc, do đó trong thư mục gốc tôi có thể gõMột makefile để biên dịch tất cả các nguồn trong một thư mục được chỉ định

make directoryName 

và nó sẽ biên dịch tất cả các nguồn trong thư mục đó, và xuất một nhị phân vào thư mục gốc. Dưới đây là những gì tôi có cho đến nay:

FLAGS= -Wall -Wextra -Wfloat-equal 
OUT=helloworld.out 

%: $(wildcard [email protected]/*.cpp) 
    g++ [email protected]/$(wildcard *.cpp) -o $(OUT) $(FLAGS) 

Nhưng khi tôi cố gắng chạy nó, tất cả tôi nhận được là

pc-157-231:Section2$ make helloWorld 
make: `helloWorld' is up to date. 

Bất kỳ giúp đánh giá cao

Sửa Lưu ý; vấn đề không phải là tôi đã không thay đổi tập tin mục tiêu; Tôi đã làm ...

+0

Thay đổi HelloWorld và sau đó sử dụng làm cho tập tin .. ở đây là không có thay đổi đó là lý do tại sao thông báo được hiển thị – Grv

+0

Tôi đã thay đổi nó, đó không phải là vấn đề –

+0

Đó là lý do tại sao nó nói rằng tập tin được cập nhật. Nó sẽ chỉ biên dịch khi có thay đổi .. nó sẽ không biên dịch – Grv

Trả lời

1

Vấn đề của bạn là GNU tự động tạo các biến như [email protected] chỉ có giá trị trong số nội dung của quy tắc. Từ GNU tạo tài liệu.

[Biến tự động] không thể truy cập trực tiếp trong danh sách điều kiện tiên quyết. Một lỗi phổ biến là cố gắng sử dụng [email protected] trong danh sách điều kiện tiên quyết; điều này sẽ không hoạt động. (source)

Additonally, bạn không cần $(wildcard ...) chức năng trong quy tắc của bạn (cả trong cơ thể và trong danh sách điều kiện tiên quyết), mặc dù nó không phải là một sai lầm hoặc là:

Wildcard mở rộng sẽ xảy ra tự động trong các quy tắc . (source)

+0

Để rõ ràng, những gì OP muốn là không thể, đó là ý của bạn? – kebs

+0

@kebs ít nhất là không đơn giản. Tôi sẽ không nói "về mặt kỹ thuật không thể" vì GNU tạo ra các lệnh + shell trong Makefile cho phép xây dựng các quy tắc cực kỳ phức tạp. – kfx

0

Tôi đã viết một thay thế cho làm mà làm này rất dễ dàng, nhưng nó là cách khác rất thực nghiệm/không-chính thức hỗ trợ vv Bạn có thể tải về từ https://github.com/dascandy/bob.

Bạn có lẽ sẽ có thể viết những dòng này như:

FLAGS= -Wall -Wextra -Wfloat-equal  

# Take all cpp files in a folder & compile it to executable with that folder name as name. 
(.*)/.*\.cpp => \1.out 
    g++ -o [email protected] $^ $(FLAGS) 

hoặc cách khác, với các đối tượng trung gian (tốt hơn cho các dự án lớn, nhưng có lẽ vô ích cho các bài tập nhỏ)

FLAGS= -Wall -Wextra -Wfloat-equal  

# Read as, compile any CPP file to a file with the same root but .o as extension 
(.*)\.cpp => \1.o 
    g++ -c -o [email protected] $^ $(FLAGS) 

# read as, take all objects in a subfolder together and compile into executable with folder name as name. 
(.*)/.*\.o => \1.out 
    g++ -o [email protected] $^ 

Các công cụ riêng của mình yêu cầu hệ thống Boost.Files được cài đặt.

Nếu bạn muốn có một mục tiêu mặc định mà biên dịch tất cả các tập tin thực thi, thêm những dòng này:

.*.out => all 
    echo -n 

(tiếng vang là bởi vì nó yêu cầu tất cả quy tắc để có một lệnh)

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