gcc静态库链接与动态链接

bal*_*486 3 c linker gcc shared-libraries static-libraries

我的构建环境是CentOS 5.我有一个名为libcunit的第三方库.我用autotools安装它,它生成libcunit.alibcunit.so.我有自己的应用程序链接到一堆共享库.libcunit.a位于当前目录中,libcunit.so并且其他共享库位于/usr/local/lib/.当我编译时:

gcc -o test test.c -L. libcunit.a -L/usr/local/lib -labc -lyz
Run Code Online (Sandbox Code Playgroud)

我收到一个链接错误:

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'
Run Code Online (Sandbox Code Playgroud)

但当我编译时.so喜欢:

gcc -o test test.c -L/usr/local/lib -lcunit -labc -lyz
Run Code Online (Sandbox Code Playgroud)

编译很好,运行也很好.

静态链接时为什么会出错libcunit.a

Emp*_*ian 6

为什么在静态链接时会出错 libcunit.a

问题是,你libcunit.a建一个古老的Linux系统上,并且依赖于已经符号删除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
Run Code Online (Sandbox Code Playgroud)