如何强制 ld 使用静态库而不是共享库

How to force ld to use a static lib instead of shared lib?

本文关键字:共享 静态 何强制 ld      更新时间:2023-10-16

我正在尝试使用测试库的静态版本按源代码构建。我有 libtest.a 和 libtest.so 可用,所以我使用"-static"选项。但是,看起来 gcc 链接器也在尝试搜索标准数学库的静态版本。知道我可以使用什么选项来链接标准库的共享版本吗?

g++ -static main.cpp -o a.out -L. -ltest

错误:

/usr/bin/ld: cannot find -lm
如果要

强制链接器使用特定库的静态版本,可以使用:filename来强制特定库,而不仅仅是为链接器指定"基本"库名称并让它使用它找到的第一个库:

g++ main.cpp -o a.out -l:./libtest.a

从 http://sourceware.org/binutils/docs-2.23.1/ld/Options.html:

-l namespec
--library=namespec

namespec 指定的归档文件或目标文件添加到 要链接的文件。此选项可以使用任意次数。如果 namespec的形式为 :filename,ld 将在库路径中搜索 一个名为 filename 的文件,否则它将在库路径中搜索 一个名为 libnamespec.a 的文件。

在支持共享库的系统上,ld 还可以搜索 libnamespec.a以外的文件。具体来说,在ELF和SunOS上。 系统,LD 将在目录中搜索一个名为 libnamespec.so搜索一个叫libnamespec.a。)BX 约定,.so 扩展名表示共享库。请注意, 此行为不适用于 :filename ,它始终指定 名为 filename 的文件。

我从未使用过迈克尔的建议,但我会把它藏起来以备将来使用。

用来完全控制库链接的技术是通过完全指定我要使用的库来避免-Ll-Bstatic-Bdynamic。该命令类似于:

g++ main.cpp -o a.out /usr/local/lib/test.a

g++ main.cpp -o a.out /usr/local/lib/test.so

g++ main.cpp -o a.out /usr/local/lib/test.so.1.0.0