2010-02-27 46 views
14

Tôi đang làm việc trong Linux, Eclipse CDT, g ++, với thư viện Boost. Có chương trình hiện có sử dụng chủ đề Boost, tôi cố gắng liên kết nó tĩnh thay vì động./Thư mục usr/local/lib chứa các tập tin sau đây:Cố gắng liên kết tĩnh Boost

libbost_thread.a 
libbost_thread.so 
libbost_thread.1.41.0 

động tác liên kết:

g++ -o"MyProgram" ./main.o -lboost_thread 

liên kết tĩnh:

g++ -static -o"MyProgram" ./main.o -lboost_thread 

sản xuất số lượng lớn các tin nhắn như:

tham chiếu không xác định đối với `pthread_mutex_init '

Làm cách nào để liên kết tĩnh với thư viện Boost?

+0

Điều này gần như giống với câu hỏi trước đây của bạn http://stackoverflow.com/questions/2328439/boost-static-linking và các bài đăng trùng lặp thường bị cau mày. –

+2

@Dirk - chúng có liên quan nhưng chắc chắn khác nhau. Câu hỏi trước là làm thế nào để nói cho người liên kết sử dụng .a thay vì .so. Câu hỏi này là về các vấn đề xảy ra khi anh ta làm điều đó. Tốt hơn là nên đăng câu hỏi có liên quan mới rồi tiếp tục câu hỏi mới cho câu hỏi hiện có. –

+0

@Samuel: Tôi đã sửa chữa và học được từ bạn về tùy chọn liên kết '-pthread'. Cảm ơn! –

Trả lời

23

Đối pthread_mutex_init, bạn muốn biên dịch/link với tùy chọn -pthread:

g++ -static -pthread -o"MyProgram" ./main.o -lboost_thread 

Vấn đề là các chức năng như pthread_mutex_init đang ở trong một thư viện riêng. Thư viện động có thể bao gồm siêu dữ liệu cho thực tế là nó cần thư viện riêng biệt (vì vậy libboost_thread.so bao gồm thực tế là nó cần libpthread).

Nhưng các thư viện tĩnh không có thông tin đó. Vì vậy, bạn cần cung cấp tham chiếu đến bất kỳ thư viện cần thiết nào khi bạn liên kết tĩnh.

Để sử dụng -pthread thay vì -lpthread, nó hơi thích hợp hơn vì nó không chỉ liên kết thư viện cần thiết mà còn cung cấp bất kỳ tùy chọn nào khác (-D_REENTRANT cho trình biên dịch).

+2

+1 để đề cập đến sự khác biệt quan trọng giữa '-lpthread' và' -pthread' –

+0

-static -pthread Cảm ơn bạn, cuối cùng nó đã thành công! Cái gì là -pthread? Tùy chọn liên kết cụ thể hoặc tăng cường gì? Nó trông giống như một phép thuật đối với tôi, nhưng tôi cần phải hiểu điều này. Tôi cũng làm việc với Tùy chọn Chương trình Tăng cường (-lboost_program_options), tôi nên sử dụng công tắc nào để liên kết nó tĩnh? –

+0

@AlexFarber: -pthread là tùy chọn gcc. Nó nói với trình biên dịch để xây dựng mã của bạn đúng cách cho luồng. –

2

Hãy thử thêm -lpthread vào lời gọi của bạn.

2

Trên Linux, thư viện động có thể tự động phụ thuộc vào các thư viện động khác để khi bạn liên kết nó, bạn sẽ nhận được các thư viện khác miễn phí. Khi liên kết tĩnh, không có hệ thống như vậy và bạn phải chỉ định các thư viện khác theo cách thủ công.

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