Sử dụng G ++ để biên dịch nhiều tệp .cpp và .h


172

Tôi vừa thừa hưởng một số mã C ++ được viết kém với một tệp cpp chứa chính và một loạt các chức năng khác. Ngoài ra còn có .hcác tệp chứa các lớp và định nghĩa hàm của chúng.

Cho đến bây giờ chương trình được biên dịch bằng lệnh g++ main.cpp. Bây giờ tôi đã phân tách các lớp .h.cpptệp tôi có cần sử dụng tệp tạo tệp hay tôi vẫn có thể sử dụng g++ main.cpplệnh?

Câu trả lời:


224

liệt kê tất cả các tệp cpp khác sau hàm main.cpp.

I E

g++ main.cpp other.cpp etc.cpp

và như thế.

Hoặc bạn có thể biên dịch tất cả chúng riêng lẻ. Sau đó, bạn liên kết tất cả các tệp ".o" kết quả lại với nhau.


152
Bạn thậm chí có thể làmg++ *.cpp -o output
rubenvb

7
Đây có phải là một thực hành xấu? Tôi muốn sử dụng nó trong makefile của tôi.
gabriel_vincent

8
@gabriel_vincent, nó không hẳn là thực hành xấu, nhưng điều đó có nghĩa là việc chỉnh sửa một tệp trong một dự án hàng trăm sẽ khiến trình biên dịch làm lại tất cả công việc cho tất cả các tệp. Biên dịch riêng cho phép biên dịch gia tăng.
Paul Draper

@gabriel_vincent Bạn không nên viết makefiles bằng tay. Sử dụng một hệ thống xây dựng thích hợp như CMake thay thế.
Baum mit Augen

3
@BaummitAugen Vâng, ngoại trừ tôi chỉ muốn biên dịch chương trình 2 tệp nhỏ này tôi đã viết trong 14 phút và tôi thực sự muốn dành 1 phút để viết một tệp makefile thay vì một giờ để thiết lập cmake.
Przemek D

55

Để biên dịch riêng mà không cần liên kết, bạn cần thêm -ctùy chọn:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out

3
Lưu ý nếu bạn muốn kiểm soát tên của tệp thực thi trong bước liên kết, hãy làm những gì bạn thường làm:g++ -o my_executable myclass.o main.o
eric

22

Bây giờ tôi đã tách các lớp thành các tệp .h và .cpp tôi có cần sử dụng tệp tạo tệp hay tôi vẫn có thể sử dụng lệnh "g ++ main.cpp"?

Biên dịch một số tệp cùng một lúc là một lựa chọn tồi nếu bạn định đưa tệp đó vào Makefile.

Thông thường trong Makefile (đối với GNU / Make ), bạn nên viết rằng:

# "all" is name of the default target, running "make" without params would use it
all: executable1

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker
CC=$(CXX)

# tell which files should be used, .cpp -> .o make would do automatically
executable1: file1.o file2.o

Cách đó makesẽ được biên dịch lại đúng cách chỉ những gì cần được biên dịch lại. Người ta cũng có thể thêm một vài điều chỉnh để tạo ra các phụ thuộc của tệp tiêu đề - do đó, điều đó cũng sẽ được xây dựng lại đúng cách những gì cần được xây dựng lại do thay đổi tệp tiêu đề.


13

Bạn vẫn có thể sử dụng g ++ trực tiếp nếu bạn muốn:

g++ f1.cpp f2.cpp main.cpp

trong đó F1.cpp và f2.cpp là các tệp có chức năng trong đó. Để biết chi tiết về cách sử dụng make để thực hiện quá trình xây dựng, hãy xem tài liệu tạo GNU tuyệt vời .


12

Tôi biết câu hỏi này đã được hỏi từ nhiều năm trước nhưng vẫn muốn chia sẻ cách tôi thường biên dịch nhiều tệp c ++.

  1. Giả sử bạn có 5 tệp cpp, tất cả những gì bạn phải làm là sử dụng dấu * thay vì nhập từng tên tệp cpp. g++ -c *.cpp -o myprogram .
  2. Điều này sẽ tạo ra "myprogram"
  3. chạy chương trình ./myprogram

đó là tất cả!!

Lý do tôi đang sử dụng * là nếu bạn có 30 tệp cpp thì bạn có nhập tất cả chúng không? hoặc chỉ sử dụng dấu * và tiết kiệm thời gian :)

ps Chỉ sử dụng phương pháp này nếu bạn không quan tâm đến makefile.


1
Lỗi xác định lại phát sinh khi tôi sử dụng phương pháp này? Có cách nào khác để làm tương tự?
Waseem Ahmad Naeem

11

.h các tệp sẽ không liên quan gì đến việc biên dịch ... bạn chỉ quan tâm đến các tệp cpp ... vì vậy hãy nhập g++ filename1.cpp filename2.cpp main.cpp -o myprogram

có nghĩa là bạn đang biên dịch từng tệp cpp và sau đó liên kết chúng lại với nhau thành myprgram .

sau đó chạy chương trình của bạn ./myprogram


7

Như rebenvp đã nói tôi đã sử dụng:

g++ *.cpp -o output

Và sau đó làm điều này cho đầu ra:

./output

Nhưng một giải pháp tốt hơn là sử dụng maketập tin. Đọc ở đây để biết thêm về makecác tập tin.

Cũng đảm bảo rằng bạn đã thêm các .htệp cần thiết trong các .cpptệp.


4

Bạn có thể sử dụng một số lệnh g ++ và sau đó liên kết, nhưng đơn giản nhất là sử dụng Makefile truyền thống hoặc một số hệ thống xây dựng khác: như Scons (thường dễ thiết lập hơn Makefiles).


2

Nếu bạn muốn sử dụng #include <myheader.hpp>bên trong các tệp cpp của mình, bạn có thể sử dụng:

g++ *.cpp -I. -o out

1

Tôi đã từng sử dụng một Makefile tùy chỉnh đã biên dịch tất cả các tệp trong thư mục hiện tại, nhưng tôi phải sao chép nó trong mọi thư mục tôi cần, mọi lúc.

Vì vậy, tôi đã tạo ra công cụ của riêng mình - Trình biên dịch chung giúp quá trình dễ dàng hơn nhiều khi biên dịch nhiều tệp.


-4

~ / In_ProjectDirectory $ g ++ tọa độ_main.cpp phối hợp_func.cpp tọa độ.h

~ / In_ProjectDirectory $ ./a.out

... Đã làm việc!!

Sử dụng Linux Mint với Geany IDE

Khi tôi lưu từng tệp vào cùng một thư mục, một tệp không được lưu chính xác trong thư mục; tập tin tọa độ. Vì vậy, kiểm tra lại và nó đã được lưu ở đó dưới dạng tọa độ.h, và không chính xác là -> tọa độ.h.gch. Những thứ nhỏ nhặt. Tranh cãi !!


3
Bạn đang bị hạ cấp bởi vì bạn đã bao gồm các tệp h, đó là một lỗi.
eric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.