我通常使用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
但是当我删除-static时,效果很好。
答案 0 :(得分:1)
GCC的-static
链接选项指示链接器忽略共享库
在链接期间。因此,它必须找到 all 所需库的静态版本
通过链接,包括默认链接的链接,例如libc
。
您尚未安装libc
的静态版本(即/usr/lib/???/libc.a
),因此:
/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status
libc.a
由libc
开发包安装。 libc
的名称
开发包以及如何安装它取决于您的发行版。例如。在Debian上
或Ubuntu,要安装的软件包为libc6-dev
;在Fedora上是glibc-develop
。
但是在您执行此操作之前,请稍等片刻。你说:
我试图用-static参数编译静态库,但它总是失败。
gcc mycode.c -static -L . -lurl -lcap -o mycode
这听起来好像只是想将程序链接到一个或两个
位于liburl.a
的静态库libcap.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.a
和libcap.a
是解决该问题的唯一候选者
-lurl
中的-lcap
和./
。
即使您确实同时拥有./liburl.a
和./liburl.so
-和/或./libcap.a
和./libcap.so
-仍然没有
需要与完全静态链接一样激烈的解决方案。您可以明确地
告诉链接器是否要找到特定的静态库,例如:
gcc mycode.c -L . -l:liburl.a -l:libcap.a -o mycode