为什么我的gcc命令没有-static参数

时间:2019-05-18 20:38:49

标签: c gcc linker-errors static-linking

我通常使用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时,效果很好。

1 个答案:

答案 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.alibc开发包安装。 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.alibcap.a是解决该问题的唯一候选者 -lurl中的-lcap./

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

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