2010-10-25 45 views
8

Tôi đang cố gắng hiểu cách sử dụng các thư viện không chuẩn trong các dự án C++ của mình. Tôi có một vài câu hỏi.C++ liên kết tới thư viện với makefile (newbe)

Cho phép nói rằng tôi muốn sử dụng thư viện POCO. Vì vậy, tôi đã tải xuống và xây dựng nó bằng cách sử dụng make (static build). Bây giờ tôi có nhiều tệp .o và .h. Có tệp Path.h và tệp Path.o trong các thư mục khác nhau.

Bây giờ tôi muốn sử dụng mô-đun này trong mã của mình. Vì vậy, tôi bao gồm các tập tin bằng cách sử dụng #include "Poco/Path.h". Tôi có phải sửa đổi makefile và thêm Path.o vào mục tiêu của tôi không?

Điều gì sẽ xảy ra khi tôi sử dụng thư viện chuẩn? Là những người chỉ có sẵn trong các tập tin tiêu đề? Tôi biết rằng mã mẫu không thể được biên dịch trước. Phần còn lại thì sao ?

Trả lời

10

Ngoài tệp .h và .o, bạn có thể cũng có một hoặc nhiều tệp libXXX.a và/hoặc libXXX.so. Đây là những tệp thư viện thực sự mà ứng dụng của bạn nên liên kết.

Để sử dụng thư viện, bạn bao gồm các tiêu đề có liên quan trong tệp nguồn và bạn thay đổi makefile của mình để cho trình liên kết biết rằng nó cũng nên liên kết ứng dụng của bạn với thư viện XXX. Lệnh liên kết điển hình cho lệnh đó là -lXXX và trình liên kết sẽ tìm kiếm cả libXXX.a và libXXX.so và sử dụng tùy chọn nào phù hợp nhất.

Thư viện chuẩn không thực sự khác với thư viện bên ngoài, ngoại trừ việc bạn không phải chỉ định rõ ràng cho trình liên kết.

+0

Vì vậy, tệp .a là một thư viện tĩnh và .so là động/chia sẻ? – Seba

+0

@ Seba: Vâng, đó là chính xác. –

+0

Cảm ơn bạn rất nhiều :) – Seba

8

Câu hỏi của bạn dường như ngụ ý rằng bạn đã có một makefile cho mã của riêng bạn. Nếu đó là trường hợp, sau đó có, bạn nên sửa đổi các quy tắc cho thực thi của bạn trong makefile đó. Như Bart van Ingen Schenau chỉ ra, POCO makefile có lẽ đã tập hợp các tệp đối tượng vào các thư viện như Poco/Libraries/libPoco.a, vì vậy bạn nên sử dụng chúng thay vì cố gắng chọn ra các tệp đối tượng mà bạn cần. Ví dụ, nếu ngay bây giờ quy tắc của bạn đọc:

foo: foo.o bar.o 
    g++ -lSomeLibrary $^ -o [email protected] 

bạn nên thay đổi nó để

foo: foo.o bar.o 
    g++ -lSomeLibrary -LPoco/Libraries -lPoco $^ -o [email protected] 

(Phần thứ hai của câu hỏi của bạn, là "Chuyện gì xảy ra ... Còn về phần còn lại?" không rõ ràng với tôi.)

Lưu ý: Ý tưởng tồi là #include "Poco/Path.h". Điều này làm cho mã của bạn phụ thuộc vào cấu trúc thư mục, điều mà nó không nên quan tâm. Nó là tốt hơn để #include "Path.h" và nói với trình biên dịch nơi để tìm thấy nó: g++ -c -IPoco ....

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