我有一个共享库被另一个应用程序超出了我的控制范围,它需要* .so对象。我的库使用sqlite3需要静态链接它(我绝对需要一个自包含的二进制文件)。C++静态链接共享库
当我尝试编译和链接我的图书馆:
-fpic -flto -pthread -m64
-flto -static -shared
我结束了以下错误:
/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
什么是重新编译-fPIC有关?我的代码或CRT?
我已经尝试用-fPIC编译我的对象,并得到相同的结果。
谢谢。
编辑:
似乎问题并不涉及到sqlite3的。
我写了编译和像这样的链接一个简单的线什么都不做的库:
g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o
,但不喜欢这样的:
g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o
的问题似乎与CRT (crtbeginT.o)。我应该重新编译GCC --with-pic或其他什么?
这有点令人困惑。你是否试图将你的库链接到一个静态的sqlite库,或者你是否还想做其他的事情? – nos
PIC =共享库所需的位置独立代码(在大多数体系结构上,我猜) – sehe
@nos试图将我的共享库链接到sqlite3.a – Petr