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