我的构建环境是CentOS 5。我有一个名为 libcunit 的第三方库。我用 autotools 安装了它,它生成了两个libcunit.a
and libcunit.so
。我有自己的应用程序,它与一堆共享库链接。libcunit.a
位于当前目录中并且libcunit.so
和其他共享库位于/usr/local/lib/
。当我编译时:
gcc -o test test.c -L. libcunit.a -L/usr/local/lib -labc -lyz
我收到链接错误:
libcunit.a(Util.o): In function `CU_trim_left':
Util.c:(.text+0x346): undefined reference to `__ctype_b'
libcunit.a(Util.o): In function `CU_trim_right':
Util.c:(.text+0x3fd): undefined reference to `__ctype_b'
但是当我编译时.so
like:
gcc -o test test.c -L/usr/local/lib -lcunit -labc -lyz
它编译得很好并且运行得很好。
为什么静态链接时会出错libcunit.a
?
为什么静态链接时会出错libcunit.a
问题是你的libcunit.a
建立在古老的 Linux 系统上,并且依赖于已经被removed from libc
(这些符号用于glibc-2.2
,并被删除glibc-2.3
10 多年前)。更准确地说,这些符号已被hidden
。它们可用于动态链接到旧的二进制文件(例如libcunit.so
)但没有新代码可以静态链接到它们(您无法创建引用它们的新可执行文件或共享库)。
你可以这样观察:
readelf -Ws /lib/x86_64-linux-gnu/libc.so.6 | egrep '\W__ctype_b\W'
769: 00000000003b9130 8 OBJECT GLOBAL DEFAULT 31 __ctype_b@GLIBC_2.2.5
readelf -Ws /usr/lib/x86_64-linux-gnu/libc.a | egrep '\W__ctype_b\W'
# no output
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)