2012-03-20 34 views
7

Tôi hiện đang nghiên cứu C++. Tôi muốn một makefile mà sẽ biên dịch tất cả các tập tin cpp trong thư mục hiện hành để tách thực thi. Ví dụ:Makefile biên dịch tất cả các tệp cpp trong một thư mục thành tệp thực thi riêng biệt

Trong một thư mục có 3 C++ file, chẳng hạn như examp1.cpp, examp2.cppexamp3.cpp. Tôi muốn có một makefile mà sẽ biên dịch và liên kết chúng và đưa ra examp1.exe, examp2.exeexamp3.exe

Tôi đã tạo ra một kịch bản bash để biên dịch tất cả trong số họ và tạo ra người yêu cũ nhưng tôi nghĩ rằng; đó không phải là cách chính xác để làm điều này.

Tôi có một Makefile cho ".c", nhưng điều đó dường như không hoạt động ở đây. Nó chỉ tạo các tệp đối tượng và không thực sự liên kết nó. Nó như sau:

SRCS=$(wildcard *.c) 
OBJS=(SRCS:.c=.o) 
all: $(OBJS) 

Đoạn mã trên biên dịch tất cả các tệp ".c" mới và đã sửa đổi có cùng tên trong thư mục hiện tại.

Các kịch bản bash Tôi đang sử dụng để tạo ra thực thi như sau:

for i in ./*.cpp 
do 
    g++ -Wno-deprecated $i -o `basename $i .cpp`".exe" 
done 

này có nghĩa là tôi muốn bất cứ điều gì "cpp" file tôi đặt trong thư mục đó, bằng cách sử dụng một cách đơn giản 'làm cho tất cả' hay bất cứ điều gì như vậy nó nên biên dịch.

+4

Bạn đã cố gắng tạo một tệp makefile chưa? Nếu vậy hãy đăng nó để chúng tôi có thể giúp bạn. Có [tài liệu] (http://www.gnu.org/software/make/manual/make.html) có sẵn để bắt đầu. – Joe

+1

Các phiên bản làm thay đổi từ nhà cung cấp này sang nhà cung cấp khác. Bạn đang sử dụng cái gì? Bạn đang sử dụng GNU Make on Linux? Microsoft thực hiện trên Windows/Visual C++? –

+1

Bạn đã thử viết một tệp makefile sẽ biên dịch * một tệp nguồn * và tạo một tệp thực thi? – Beta

Trả lời

16

Một Makefile tối thiểu mà những gì bạn muốn sẽ là:

#Tell make to make one .out file for each .cpp file found in the current directory 
all: $(patsubst %.cpp, %.out, $(wildcard *.cpp)) 

#Rule how to create arbitary .out files. 
#First state what is needed for them e.g. additional headers, .cpp files in an include folder... 
#Then the command to create the .out file, probably you want to add further options to the g++ call. 
%.out: %.cpp Makefile 
    g++ $< -o [email protected] -std=c++0x 

Bạn sẽ phải thay thế g ++ bởi trình biên dịch bạn đang sử dụng và có thể điều chỉnh một số thiết lập nền tảng cụ thể, nhưng các Makefile bản thân nên làm việc .

+0

Bằng cách sử dụng Makefile này; ví dụ nếu tôi có một tập tin "hello.cpp" tôi phải sử dụng "make hello.ra ", nhưng tôi hỏi nếu tôi sử dụng" làm cho tất cả "sẽ biên dịch" hello.cpp "thành" hello.out ".Tại đây khi tôi sử dụng Makefile ở trên, tôi nhận được" Không có gì để được thực hiện cho tất cả " – kaushik

+0

Bạn đã thử nó? xD Nó chỉ định trong dòng thứ hai là lệnh make all cần một tệp .out cho mỗi tệp .cpp được tìm thấy trong thư mục, do đó một cuộc gọi để thực hiện tất cả sẽ thực hiện kết quả trong một cuộc gọi ví dụ: make hello.out, bye Chắc chắn bạn cũng có thể sử dụng hello.out vì quy tắc được chỉ định, nhưng bạn không phải làm như vậy. – Haatschii

+0

Ok, hãy thử lại một lần nữa, tôi quên đặt $ (ký tự đại diện * .cpp) trong Bây giờ nó sẽ hoạt động như mong đợi – Haatschii

1

Cách đơn giản nhất makefile bạn có thể tạo mà có thể làm việc cho bạn là thế này:

all: examp1.exe examp2.exe examp3.exe 

Điều đó sẽ sử dụng quy tắc mặc định làm để tạo ra ba chương trình của bạn.

3

Đây là Makefile mà tôi sử dụng

CC = gcc 
CFLAGS = -g -O2 -std=gnu99 -static -Wall -Wextra -Isrc -rdynamic -fomit-frame-pointer 
all: $(patsubst %.c, %.out, $(wildcard *.c)) 
%.out: %.c Makefile 
    $(CC) $(CFLAGS) $< -o [email protected] -lm 
clean: 
    rm *.out      

Bạn nên dán nó ở đâu đó trong nhà của bạn và bất cứ khi nào bạn thay đổi dirctory chỉ cần sao chép nó ở đó. Tôi sử dụng bí danh trong ~/.basrc của tôi để sao chép nó

alias get_makefile_here='cp ~/Makefile ./' 

Chỉ cần nhấn make và bam, bạn đã hoàn tất. Cũng lưu ý rằng một khi bạn đã hoàn tất với các tệp cũ, nó sẽ không xây dựng lại tệp thực thi của chúng.

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