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

Raj*_*jat 1 c++ linker g++

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

g++ -static main.cpp -o a.out -L. -ltest
Run Code Online (Sandbox Code Playgroud)

错误:

/usr/bin/ld: cannot find -lm
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 8

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

g++ main.cpp -o a.out -l:./libtest.a
Run Code Online (Sandbox Code Playgroud)

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

-l namespec
--library=namespec
Run Code Online (Sandbox Code Playgroud)

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

在支持共享库的系统上,ld也可以搜索除以外的文件libnamespec.a.具体来说,在ELF和SunOS系统上,ld将libnamespec.so在搜索被调用的库之前在目录中搜索所调用的库 libnamespec.a.(按照惯例,.so扩展名表示共享库.)请注意,此行为不适用于:filename,它始终指定一个名为的文件filename.