“没有版本符号的符号版本部分”
问题描述:
我试图交叉编译我自己的共享库(libmystuff.so)针对使用libcurl共享库的另一个共享库(libtheirstuff.so),并且获取以下错误:“没有版本符号的符号版本部分”
libmystuff.so: No symbol version section for versioned symbol
'[email protected]@CURL_OPENSSL_3'
,然后依次为:
通过创建libtheirstuff代码去,我可以看到,curl_global_init是卷曲的第一参考。
在目标平台(arm5)上做ldd libtheirstuff.so
显示它可以找到所有的引用。
这是怎么回事吗?
编辑:这是gcc的
arm-none-linux-gnueabi-gcc -fPIC -c mystuff_impl.c -o mystuff_impl.o -I/home/me/arm/include
arm-none-linux-gnueabi-gcc -shared -Wl,soname=libmystuff.so -o libmystuff.so.0.1 mystuff_impl.o -L/home/me/arm/lib -ltheirstuff
答
接头抓住了错误版本的电话。
答
当您尝试编译可用于多个Linux发行版的二进制文件时,也会出现此问题(No symbol version section for versioned symbol '[email protected]@CURL_OPENSSL_3'
)。您可以检查这样的问题:
$ objdump -x mybinary | grep curl_global_init
0... F *UND* 0... [email protected]@CURL_OPENSSL_3
在这种情况下的解决方案是建立在那里的libcurl编译了./configure --disable-versioned-symbols
的机器上。以这种方式编译的二进制文件可以在其他地方使用(包括使用版本化符号的系统)。一个便携式二进制应该产生像这样的输出(没有任何@
符号):
$ objdump -x mybinary | grep curl_global_init
0... F *UND* 0... curl_global_init
它可能是你在链接库的顺序? – 2013-03-08 23:20:29
我只连接一个库。请参阅编辑gcc的调用。 – cachance7 2013-03-09 00:39:17
看起来像其他人也有类似的问题。也许需要使用其他版本的卷曲库,一个与该头部库兼容。 – 2013-03-09 01:06:41