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

时间:2013-01-24 04:47:20

标签: c++ linker g++

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

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

错误:

/usr/bin/ld: cannot find -lm

2 个答案:

答案 0 :(得分:8)

如果要强制链接器使用特定库的静态版本,可以使用: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的{​​{1}}之前libnamespec.a。 (通过   约定,.so扩展名表示共享库。)请注意   此行为不适用于:filename,它始终指定一个   名为filename的文件。

答案 1 :(得分:0)

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

我用来完全控制库链接的技术是通过完全指定-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