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

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

错误消息是:
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

但当我移除-静电它工作得很好。

最佳答案

GCC的-static链接选项指示链接器忽略共享库
在联动过程中。所以它必须找到所需的所有库的静态版本
通过链接,包括默认链接的链接,如libc
您尚未安装静态版本的libc(它将是/usr/lib/???/libc.a),因此:

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

libc.a由开发包安装。libc的名称
开发包以及如何安装取决于发行版。例如,关于Debian
或者Ubuntu,要安装的包是libc;在Fedora上是libc6-dev
但在你去做之前,先别挂断。你说:
我试图用-static参数编译静态库它总是失败的。
gcc mycode.c  -static  -L .  -lurl -lcap  -o mycode

听起来你只是想把你的程序和一个或两个链接起来
静态库glibc-developliburl.a,位于libcap.a中,并认为您应该
通过将./传递到链接来执行此操作。
无需通过-static即可将您的程序与-static和/或
./liburl.a。选项:
-L .  -lurl -lcap

将指示链接器在./libcap.a中搜索其中一个文件(共享库)
./(静态库),如果它找到其中一个或另一个,它将链接您的
用那个图书馆的程序。如果在liburl.so中找到它们,则它将选择
共享库liburl.a。所以除非你有./liburl.so
然后:
-L .  -lurl

它本身会将您的程序链接到./liburl.so
对于./liburl.a,也是如此。不需要./liburl.a。默认共享库-lcap
将自动链接。链接器链接你的程序完全没有问题
有一些静态库和一些共享库。这就是已经发生的事情
与您成功的联系:
gcc mycode.c  -L .  -lurl -lcap  -o mycode

假设-staticlibc.so是解决
liburl.a中的libcap.a-lurl
即使你同时拥有-lcap./-和/或./liburl.a./liburl.so-仍然没有
需要一个像完全静态链接一样极端的解决方案。你可以直接
告诉链接器找到一个特定的静态库,如果这是您想要的,例如:
gcc mycode.c  -L .  -l:liburl.a -l:libcap.a  -o mycode

10-08 11:14