我正在尝试使用测试库的静态版本按源代码构建。我有 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
. (按照惯例,.so 扩展名表示共享库。)请注意,此行为不适用于:filename
,它始终指定一个名为filename
.
我从来没有使用过迈克尔的建议,但我会把它藏起来以备将来使用。
我用来完全控制库链接的技术是通过完全指定我想要使用的库来完全避免, -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