我正在尝试使用测试库的静态版本来源构建。我有libtest.a和libtest.so可用,所以我使用“-static”选项。但是,看起来gcc链接器也试图搜索标准数学库的静态版本。 知道我可以用什么选项来链接标准库的共享版本吗?
g++ -static main.cpp -o a.out -L. -ltest
错误:
/usr/bin/ld: cannot find -lm
答案 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)
我从来没有使用迈克尔的建议,但是我会把它藏起来以备将来使用。
我用来完全控制库链接的技术是通过完全指定-L
,l
,-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