我遇到了一个问题,编译时gcc
编译了-static
,-static-libgcc
标志为编译器启用,并且在Ubuntu 12.10上为链接器启用了-Wl,-static
标志。但是应用程序可以通过动态链接(不使用这些标志)来构建。
/usr/bin/ld: cannot find -lgcc_s
在通过互联网查看建议后,我发现大多数情况下,从/usr/lib/gcc/i686-linux-gnu/x.x/libgcc_s.so
到/lib/libgcc_s.so.1
的链接断开是一个问题。但在我的情况下,/usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so
指的是确实存在的/lib/i386-linux-gnu/libgcc_s.so.1
。
$ ls -l /usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so
lrwxrwxrwx 1 root root 33 Sep 21 2012 /usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so -> /lib/i386-linux-gnu/libgcc_s.so.1
$ ls -l /lib/i386-linux-gnu/libgcc_s.so.1
-rw-r--r-- 1 root root 116244 Sep 21 2012 /lib/i386-linux-gnu/libgcc_s.so.1
$ file /lib/i386-linux-gnu/libgcc_s.so.1
/lib/i386-linux-gnu/libgcc_s.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x61fa08eda0f264222649f9481f9e0340567d0862, stripped
ldconfig
的输出显示以下内容:
$ sudo /sbin/ldconfig -v | grep libgcc_s
/sbin/ldconfig.real: Can't stat /lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Can't stat /usr/lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Path `/lib/i386-linux-gnu' given more than once
/sbin/ldconfig.real: Path `/usr/lib/i386-linux-gnu' given more than once
libgcc_s.so.1 -> libgcc_s.so.1
/sbin/ldconfig.real: Cannot stat /usr/lib/i386-linux-gnu/libsoftokn3.so: No such file or directory
/sbin/ldconfig.real: Cannot stat /usr/lib/i386-linux-gnu/libnss_db.so: No such file or directory
任何人都可以通过静态链接帮我解决这个问题吗?如果需要进一步的细节,也请告诉我。感谢。
答案 0 :(得分:4)
您的链接器可能无法找到libgcc_s.a
,libgcc_s.so
的静态版本。
尝试将-Wl,--verbose=99
传递给链接器,看看会出现什么。
前一段时间我遇到过类似的问题。使用链接器选项给出了答案:
...
attempt to open /long_path/usr/lib/libgcc_s.so failed
attempt to open /long_path/usr/lib/libgcc_s.a failed
attempt to open /long_path/lib/libgcc_s.a failed
attempt to open /long_path/lib/libgcc_s.so succeeded
...
据我所知, .so 代表“共享对象”。我想 .a 用于存档(编译对象的集合)。