Mam wspólną bibliotekę używaną przez inną aplikację, która jest poza moją kontrolą i która wymaga obiektów * .so. Moja biblioteka korzysta z sqlite3, który musi być statycznie połączony z nim (absolutnie potrzebuję samodzielnego pliku binarnego).C++ Statycznie połączona biblioteka współdzielona
Kiedy próbuję skompilować i połączyć moją bibliotekę:
-fpic -flto -pthread -m64
-flto -static -shared
I skończyć z powodu następującego błędu:
/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
Co Przekompiluj z flagą -fPIC związane? Mój kod lub CRT?
Próbowałem już skompilować mój obiekt za pomocą opcji -fPIC z tym samym wynikiem.
Dzięki.
EDIT:
Problem nie wydaje się być związane z SQLite3.
napisałem prostą bibliotekę jedna linia-do-niczego, co kompiluje i łącza takie jak ten:
g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o
ale nie w ten sposób:
g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o
Problem wydaje się być związane z CRT (crtbeginT.o). Czy mam rekompilować GCC - z pic-picem lub czymkolwiek?
To trochę zagmatwane. Czy próbujesz po prostu połączyć bibliotekę ze statyczną biblioteką sqlite, czy też próbujesz zrobić coś innego? – nos
PIC = kod niezależny od pozycji, wymagany dla bibliotek współdzielonych (na większości architektur, jak sądzę) – sehe
@nos Próbuję połączyć moją bibliotekę współdzieloną z sqlite3.a – Petr