2012-05-25 47 views
13

im cố gắng xây dựng một thư viện chia sẻ trên một nền tảng cửa sổ Cygwin sử dụng g ++, và sau đó liên kết nó với một tập tin cpp: tôi sử dụng các lệnh sau:xây dựng và liên kết một thư viện chia sẻ

// generate object file 

g++ -g -c -Wall -fPIC beat11.cpp -o beat11.o 

// to generate library from the object file 

g++ -shared -Wl,-soname,libbeat.so.1 -o libbeat.so.1.0.1 beat11.o -lc 

// to link it with another cpp file; -I option to refer to the library header file 

g++ -L. -lbeat -I . -o checkbeat checkbeat.cpp 

trong khi liên kết, các lỗi sau cây trồng lên:

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: 
    cannot find -llibbeat.so.1.0.1 

collect2: ld returned 1 exit status 

thư viện được tạo ra chỉ là tốt, nhưng tôi chỉ có thể tìm thấy libbeat.so.1.0.1, không libbeat.so hoặc libbeat.so.1 (hoặc là họ không được phép ở đó?)

một trong những câu hỏi khác đề nghị tạo ra một liên kết tượng trưng đến libbeat.so.1.0.1, nhưng điều đó làm việc quá didnt

Trả lời

13

Khi sử dụng -l<libname> để xác định thư viện liên kết, các mối liên kết sẽ đầu tìm kiếm lib<libname>.so trước khi tìm kiếm lib<libname>.a.

Trong trường hợp của bạn không hoạt động, vì tên tệp thư viện không có hậu tố .so.

Bạn có thể tạo simlink

libbeat.so -> libbeat.so.1.0.1 

hoặc

libbeat.so -> libbeat.so.1 
libbeat.so.1 -> libbeat.so.1.0.1 

Bạn cũng có thể sử dụng -l:libbeat.so.1.0.1 (nếu mối liên kết của bạn hỗ trợ nó, kiểm tra trong man ld mô tả về -l tham số). Một lựa chọn khác là để xác định thư viện mà không -l

g++ -o checkbeat checkbeat.cpp -I . -L. libbeat.so.1.0.1 

Lưu ý rằng thư viện bạn liên kết đến nên được đặt sau khi tập tin đối tượng/nguồn sử dụng những biểu tượng của nó - nếu không thì mối liên kết có thể không tìm thấy những biểu tượng.

+0

Tôi đã có cùng một vấn đề và bình luận của bạn bằng cách sử dụng -l: libname.so làm việc. Tuy nhiên, tôi không thực sự hiểu lý do tại sao nó không hoạt động với -L -lname như bạn đã nói rằng mối liên kết nên tìm kiếm lib .so là tốt. nó cũng là sự hiểu biết của tôi rằng nó sẽ làm việc nhưng ít nhất với Cygwin nó không có vẻ là trường hợp. Không cố gắng với các trình biên dịch khác. – Devolus

+0

Câu trả lời ở đây đã giúp tôi: http://stackoverflow.com/questions/16154130/cygwin-g-linker-doesnt-find-shared-library – solstice333

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