为什么我的 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.a
由libc
开发包安装。 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.a
、libcap.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.a
和 libcap.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
我通常使用 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.a
由libc
开发包安装。 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.a
、libcap.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.a
和 libcap.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