Làm thế nào để tạo một thư viện tĩnh với g ++?


101

Ai đó có thể cho tôi biết cách tạo thư viện tĩnh từ tệp .cpp và .hpp được không? Tôi có cần tạo .o và .a không? Tôi cũng muốn biết cách biên dịch thư viện tĩnh trong và sử dụng nó trong mã .cpp khác. Tôi có header.cpp, header.hpp .tôi muốn tạo header.a. Kiểm tra tiêu đề test.cpp. A trong . Tôi đang sử dụng g ++ để biên dịch.


3
Bạn có thể vui lòng chấp nhận câu trả lời của @ NeilButterworth (hoặc một câu khác) không?
einpoklum

Câu trả lời:


110

Tạo tệp .o:

g++ -c header.cpp

thêm tệp này vào thư viện, tạo thư viện nếu cần:

ar rvs header.a header.o

sử dụng thư viện:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o kiểm tra, không?
linuxx

11
@unapersson: Tại sao? Thực thi là khônga.outdạng vì vậy đây là rất gây hiểu lầm. Và tại sao bạn nên "không bao giờ" tạo một tệp thực thi được gọi test?
Các cuộc đua ánh sáng trong quỹ đạo

5
@Tomalak Geret'kal: Tôi đoán điều này liên quan đến thực tế testlà một lệnh hệ thống. Nhưng vì các chương trình thử nghiệm thường không bao giờ được cài đặt trong thư mục bin hệ thống và yêu cầu bạn viết ./testnó cũng không phải là vấn đề quá lớn đối với tôi ...
EOn

10
@unapersson: Không. Tôi đang nói chính xác những gì tôi đã nói. Các tệp thực thi không còn được tạo ở a.outđịnh dạng nữa, nhưng tên vẫn còn vì lý do kế thừa. (Và nếu bạn không có khả năng sử dụng một vỏ đúng thì đó là vấn đề của bạn;. Tôi cho một bí quyết làm thế nào để chạy một thực thi từ thư mục hiện hành testtốt cho một cái tên thực thi, miễn là bạn đang viết just a test nhanh tất nhiên là đoạn mã.)
Lightness Races in Orbit,

4
Đặt tên cho tệp thực thi testlà điều mà tôi đã học được cách khó để hối tiếc và tôi "hoàn toàn có khả năng sử dụng một trình bao". Đó là một ý tưởng tồi, và tôi đã thấy nó cắn nhiều người khác, những người "hoàn toàn có khả năng sử dụng vỏ".
Tổng thống James K. Polk

46

Bạn có thể tạo .atệp bằng artiện ích, như sau:

ar crf lib/libHeader.a header.o

liblà một thư mục chứa tất cả các thư viện của bạn. thực hành tốt là tổ chức mã của bạn theo cách này và tách mã và tệp đối tượng. Có tất cả mọi thứ trong một thư mục thường trông xấu xí. Dòng trên tạo libHeader.atrong thư mục lib. Vì vậy, trong thư mục hiện tại của bạn, hãy thực hiện:

mkdir lib

Sau đó chạy arlệnh trên .

Khi liên kết tất cả các thư viện, bạn có thể làm như vậy:

g++ test.o -L./lib -lHeader -o test  

Các -Llá cờ sẽ nhận được g++thêm các lib/thư mục vào con đường. Bằng cách này, g++biết những gì thư mục để tìm kiếm khi tìm kiếm libHeader. -llibHeadergắn cờ thư viện cụ thể để liên kết.

nơi test.o được tạo như vậy:

g++ -c test.cpp -o test.o 

2
và với lib / libHeader.a là gì? ar rcs ... nó không tốt hơn ar crf sao?
linuxx

1
@linuxx: main.o sẽ là tệp đối tượng mà bạn tạo từ main.cc
Sriram

@linuxx: các cờ chính xác bạn sử dụng với tiện ích ar là do bạn quyết định dựa trên yêu cầu của bạn. Tìm kiếm các trang người đàn ông cho ar sẽ là một ý tưởng hay.
Sriram

làm thế nào để kiểm tra thư viện bằng test.cpp?
linuxx

19
Nó sẽ không được -lHeaderthay vì -llibHeader?
Dolanor

30

Ai đó có thể cho tôi biết cách tạo thư viện tĩnh từ tệp .cpp và .hpp được không? Tôi có cần tạo .o và .a không?

Đúng.

Tạo .o (như bình thường):

g++ -c header.cpp

Tạo kho lưu trữ :

ar rvs header.a header.o

Kiểm tra :

g++ test.cpp header.a -o executable_name

Lưu ý rằng có vẻ hơi vô nghĩa nếu tạo một kho lưu trữ chỉ với một mô-đun trong đó. Bạn có thể dễ dàng viết:

g++ test.cpp header.cpp -o executable_name

Tuy nhiên, tôi sẽ cung cấp cho bạn lợi ích của sự nghi ngờ rằng trường hợp sử dụng thực tế của bạn phức tạp hơn một chút, với nhiều mô-đun hơn.

Hi vọng điêu nay co ich!


1
Làm thế nào để chúng tôi bao gồm nhiều mô-đun?
Sidhin S Thomas

2
Tốt! Đôi khi chúng ta thấy ranlibđiều đó trong GNU chỉ đơn giản là có nghĩa ar s.
Viet
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.