gpt4 book ai didi

c - 为什么我的 gcc 命令不能有 -static 参数

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:12 24 4
gpt4 key购买 nike

我通常使用 gcc 来编译我的 C 程序,它工作正常,但是当我尝试使用 -static 参数编译静态库时它总是失败。虽然我在谷歌上尝试了一些解决方案,但仍然没有得到解决。

我的命令如下:

gcc mycode.c  -static  -L .  -lurl -lcap  -o mycode

错误信息是:

/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

但是当我删除 -static 时它工作得很好。

最佳答案

GCC 的 -static 链接选项指示链接器忽略共享库在链接期间。所以它必须找到所需库的所有静态版本通过链接,包括默认链接的那些,例如 libc

您还没有安装 libc 的静态版本(应该是 /usr/lib/???/libc.a),所以:

/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

libc.alibc 开发包安装。 libc 的名称开发包以及如何安装它取决于您的发行版。例如。在 Debian 上或者 Ubuntu,要安装的包是 libc6-dev;在 Fedora 上是 glibc-develop

但在你开始之前,先打个勾。你说:

I tried to compile static library with -static parameter it always failed.

gcc mycode.c  -static  -L .  -lurl -lcap  -o mycode

这听起来好像您只是想将您的程序与一个或两个链接起来静态库 liburl.alibcap.a,位于 ./,并且认为您应该通过将 -static 传递给链接来完成。

无需传递 -static 即可将您的程序与 ./liburl.a 和/或./libcap.a。选项:

-L .  -lurl -lcap

将指示链接器在 ./ 中搜索任一文件 liburl.so(共享库)或 liburl.a(静态库),如果找到其中一个,它将链接您的用那个库编程。如果它在 ./ 中找到两者,那么它将选择共享库 liburl.so。所以除非你有 ./liburl.so 以及 ./liburl.a然后:

-L .  -lurl

本身会将您的程序链接到 ./liburl.a

-lcap 也是如此。不需要 -static。默认共享库libc.so将自动链接。链接器链接你的程序完全没有问题有一些静态库和一些共享库。这就是已经发生的与您的成功联系:

gcc mycode.c  -L .  -lurl -lcap  -o mycode

假设 liburl.alibcap.a 是解析的唯一候选对象./.

中的 -lurl-lcap

即使您确实同时拥有./liburl.a./liburl.so - 和/或。/libcap.a./libcap.so - 仍然没有需要像完全静态链接一样激烈的解决方案。你可以明确地告诉链接器找到一个特定的静态库,如果这是你想要的,比如:

gcc mycode.c  -L .  -l:liburl.a -l:libcap.a  -o mycode

关于c - 为什么我的 gcc 命令不能有 -static 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56202674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com