如何强制 ld 使用静态库而不是共享库
How to force ld to use a static lib instead of shared lib?
我正在尝试使用测试库的静态版本按源代码构建。我有 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
的文件。
我从未使用过迈克尔的建议,但我会把它藏起来以备将来使用。
我用来完全控制库链接的技术是通过完全指定我要使用的库来避免-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
相关文章:
- 将静态库链接到不带-fPIC的共享库中
- C++两个源文件之间共享的枚举的静态实例
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- Android NDK:用于第三方Java库的静态或共享C++运行时
- 仅在少数方法(静态或共享库)中解析的外部符号
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何在共享库中保留静态库中的自由函数
- Cmake 查找模块用于区分共享库或静态库
- 指向静态常量对象的共享指针?
- 从静态库构建共享库
- c++ 防止类共享静态对象
- 跨共享/静态库集成C++自定义内存分配器
- 混合共享/静态库时静态成员的多个副本
- 在动态库之间共享静态库中的数据
- Python C 接口,不同的模块共享静态变量
- 在多个解决方案之间共享C++静态库会导致不必要的重建
- 在同一DLL的实例之间共享静态和全局变量
- 跨dll共享静态模板数据
- Xcode不与共享库共享静态变量