【发布时间】:2011-07-09 11:13:36
【问题描述】:
我有一个共享库被我无法控制的另一个应用程序使用,它需要 *.so 对象。我的库使用了需要与其静态链接的 sqlite3(我绝对需要一个独立的二进制文件)。
当我尝试编译和链接我的库时:
-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
recompile with -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 库,还是尝试做其他事情?
-
PIC = 位置无关代码,共享库需要(我猜在大多数架构上)
-
@nos 尝试将我的共享库与 sqlite3.a 链接
-
@Petr 在这种情况下,您至少应该删除
-static标志,如果您也有共享库版本的 sqlite,请使用-Wl,-Bstatic -lsqlite3 -Wl,-Bdynamic使其获取静态版本libsqlite. -
@nos 谢谢。 -Bstatic 似乎有效。真的不知道为什么,因为它应该与 -static 相同(至少根据手册)。如果你愿意,你可以写一个答案,这样我就可以标记它已解决。
标签: c++ static-libraries crt dynamic-library