2011-07-09 32 views
25

Tôi có một thư viện được sử dụng bởi một ứng dụng khác ngoài tầm kiểm soát của tôi yêu cầu đối tượng * .so. Thư viện của tôi sử dụng sqlite3 cần được liên kết tĩnh với nó (tôi hoàn toàn cần một nhị phân độc lập).C++ Thư viện được chia sẻ liên kết tĩnh

Khi tôi cố gắng biên dịch và liên kết thư viện của tôi:

-fpic -flto -pthread -m64 
-flto -static -shared 

tôi kết thúc với các lỗi sau:

/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC 
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

gì được biên dịch lại với -fPIC liên quan đến? Mã của tôi hoặc CRT?

Tôi đã cố gắng biên dịch đối tượng của mình bằng -fPIC với cùng một kết quả.

Cảm ơn.

EDIT:

Vấn đề dường như không có liên quan đến SQLite3.

Tôi đã viết một thư viện một dòng-do-không có gì đơn giản mà biên dịch và liên kết như thế này:

g++ -c -fPIC -o bar.o bar.cpp 
g++ -shared -o bar.so bar.o 

nhưng không như thế này:

g++ -c -fPIC -o bar.o bar.cpp 
g++ -static -shared -o bar.so bar.o 

vấn đề này dường như có liên quan đến hình CRT (crtbeginT.o). Tôi có nên biên dịch lại GCC - with-pic hay gì đó không?

+0

Điều này hơi khó hiểu. Bạn đang cố gắng để chỉ liên kết thư viện của bạn với một thư viện sqlite tĩnh, hoặc bạn đang cố gắng để làm điều gì đó khác không? – nos

+0

PIC = Vị trí mã độc lập, cần thiết cho libs chia sẻ (trên hầu hết các kiến ​​trúc, tôi đoán) – sehe

+0

@nos Cố gắng liên kết thư viện được chia sẻ của tôi với sqlite3.a – Petr

Trả lời

35

Bạn không nên sử dụng -static cờ khi tạo ra một thư viện chia sẻ, đó là để tạo thực thi liên kết tĩnh.

Nếu bạn chỉ có phiên bản tĩnh của thư viện, bạn chỉ có thể liên kết nó bằng cách sử dụng . Nhưng nếu có cả phiên bản động (.so) và phiên bản tĩnh, trình liên kết sẽ thích phiên bản động hơn.

Để hướng dẫn trình liên kết chọn một liên kết tĩnh, hãy gắn cờ liên kết -Bstatic và làm cho liên kết động trở thành liên kết động cho các nội dung khác (như libc và hỗ trợ thời gian chạy động) với -Bdynamic. Tức là, bạn sử dụng cờ:

-Wl,-Bstatic -lsqlite3 -Wl,-Bdynamic 

Thay thế, bạn có thể chỉ định đường dẫn đầy đủ của tệp .a, ví dụ: /usr/lib/libsqlite3.a thay vì bất kỳ cờ biên dịch/trình liên kết nào.

Với GNU ld, bạn cũng có thể sử dụng -l:libsqlite3.a thay vì . Điều này sẽ buộc sử dụng tệp thư viện libsqlite3.a thay vì libsqlite3.so, mà trình liên kết thích mặc định.

Hãy nhớ đảm bảo tệp .a đã được biên dịch với cờ -fpic, nếu không bạn thường không thể nhúng nó vào thư viện được chia sẻ.

+0

Tôi có cùng một vấn đề ở đây và không biết cách biên dịch thư viện được chia sẻ KHÔNG liên kết động với các nhân viên phụ thuộc phân phối như libc/libstdC++ - '-Bstatic' cung cấp thư viện được chia sẻ liên kết động. Tuyệt vời, bằng cách sử dụng MinGW trên Windows tôi có thể liên kết .dll với '-static' đúng cách (chỉ phụ thuộc vào dlls windows nhưng không phải của mingw). Có cách nào để liên kết .so tĩnh ??? – Nick

+0

No. unix thư viện được chia sẻ hoạt động rất khác với các dll của windows. – nos

+0

Thủ thuật -l: libsqlite3.a cũng hoạt động trong nhật thực cdt. Nhập: libsqlite3.a trong Properties-> C/C++ Build-> Settings-> GCC C Linker-> Thư viện và xây dựng sẽ liên kết tĩnh với thư viện. – zztops

7

Bất kỳ mã nào bằng cách nào đó sẽ thực hiện theo cách của nó vào thư viện động sẽ có thể định vị lại. Nó có nghĩa là tất cả mọi thứ được liên kết với .so của bạn, không có vấn đề tĩnh hoặc động, nên được biên dịch với -fPIC. Cụ thể, thư viện tĩnh sqlite cũng phải được biên dịch với -fPIC.

chi tiết về những gì PIC phương tiện đang ở đây: http://en.wikipedia.org/wiki/Position-independent_code

+0

Tôi biên dịch lại sqlite3 - with-pic nhưng kết quả vẫn như cũ ... – Petr

+0

Đăng các lệnh liên kết hoàn chỉnh mà bạn thực hiện để chúng tôi có thể phân tích thêm) – vines

+0

Xem bài đăng gốc. – Petr

0

Tôi gặp vấn đề tương tự. Rõ ràng -static không giống như -Bstatic. Tôi chuyển sang -Bstatic và mọi thứ đã hoạt động.