其他分享
首页 > 其他分享> > c-静态链接库时,出现链接器错误:找不到-lgcc_s

c-静态链接库时,出现链接器错误:找不到-lgcc_s

作者:互联网

我想静态链接库说libcurl.由于静态库和共享库都在同一文件夹中,因此我在使用-Wl,-Bstatic来使链接程序知道使用静态库.

g++ -o prog prog.o -Wl,-Bstatic -lcurl. 

但是上面的命令给出了错误:

/usr/bin/ld: cannot find -lgcc_s

如果我排除-Wl,-Bstatic,它可以正常工作,但是它将使用我不想要的共享库.

怎么了?

解决方法:

使用g前端执行链接时,例如:

g++ -o prog prog.o -Wl,-Bstatic -lcurl

g调用链接器,将其传递给您的链接选项,并且也进行静默
向链接器命令行添加了大量样板选项,这些选项
C链接不变.

例如,您的C程序很可能需要链接标准C库,
libstdc,但是您的g命令没有提及它.当然也需要标准的C库,
但也没有提及. g自动添加链接选项以链接这些和
其他图书馆.

您可以通过运行g查看添加到链接的所有样板
详细模式.您将看到类似的内容:

$g++ -v -o prog prog.o -Wl,-Bstatic -lcurl
...
...
COLLECT_GCC_OPTIONS='-v' '-o' 'prog' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so \
 -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper \
 -plugin-opt=-fresolution=/tmp/cckwrJp6.res -plugin-opt=-pass-through=-lgcc_s \
 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc \
 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc \
 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu \
 --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro \
 -o prog /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o \
 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o \
 /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o \
 -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu \
 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu \
 -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib \
 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. prog.o \
 -Bstatic -lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc \     
 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o \
 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o
/usr/bin/x86_64-linux-gnu-ld: cannot find -lgcc_s
/usr/bin/x86_64-linux-gnu-ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status

特别注意您的-Bstatic选项和以下链接选项:

 -Bstatic -lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc \     
 /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o \
 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o

其中包括-lcurl和默认系统库:

-lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc

然后查看documentation of the -Bstatic linker option

-Bstatic

Do not link against shared libraries. This is only meaningful on platforms for which shared libraries are supported.
The different variants of this option are for compatibility with various systems.
You may use this option multiple times on the command line: it affects library searching for -l options which follow it.
This option also implies –unresolved-symbols=report-all. This option can be used with -shared.
Doing so means that a shared library is being created but that all of the library’s external
references must be resolved by pulling in entries from static libraries.

[我的重点]

因此,您的-Bstatic选项可指示链接程序链接以下静态版本:

-lcurl -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc

它会找到您已安装的静态libcurl.a.找不到
-lgcc_s的静态库,因为没有安装任何libgcc_s.a
你的系统.您只有该版本和其他基本系统库的动态版本,
这很正常.

如果您希望链接器仅链接您所使用的-l选项的静态库
指定,那么必须在-l选项之前打开-Bstatic并将其关闭
在它们之后是-Bdynamic,即使这使-Bdynamic成为命令行中的最后一件事.
因为g(或任何其他GCC前端,gcc,gfortran …)将添加-l
后台命令行选项.链接类似:

g++ -o prog prog.o -Wl,-Bstatic -lcurl -Wl,-Bdynamic

解决此特定的链接错误.

标签:linker,g,static-linking,linux,c-4
来源: https://codeday.me/bug/20191025/1925216.html