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?
Đ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
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
@nos Cố gắng liên kết thư viện được chia sẻ của tôi với sqlite3.a – Petr