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

why can my gcc command not have -static parameter

我通常使用 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 时它工作得很好。

GCC 的 -static linkage 选项指示 linker 忽略共享库 在 link 年龄。所以它必须找到 all 静态版本所需的库 按 link 年龄,包括那些默认为 link 的,例如 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

这听起来好像你只是想 link 你的程序有一个或两个 静态库 liburl.alibcap.a,位于 ./,并且认为您应该 通过将 -static 传递给 linkage 来实现。

不需要将 -static 传递给 link 你的程序 ./liburl.a and/or ./libcap.a。选项:

-L .  -lurl -lcap

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

-L .  -lurl

你的程序本身 link 将对抗 ./liburl.a

-lcap 也是如此。不需要 -static。默认共享库 libc.so 将自动 linked。 linker 完全没有问题link你的程序 有一些静态库和一些共享库。这就是 已经发生的事情 您的成功 link年龄:

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

假设 liburl.alibcap.a 是解析的唯一候选者 -lurl-lcap./.

即使您 同时拥有 ./liburl.a./liburl.so - and/or ./libcap.a./libcap.so - 仍然没有 需要像完全静态的 linkage 这样极端的解决方案。你可以显式 告诉 linker 找到一个特定的静态库,如果那是你想要的,比如:

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