linux静态链接库添加,c-静态链接库时,出现链接器错误:找不到-...

使用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

-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

解决此特定的链接错误.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值