全静态标准库链接方式

简介:

场景说明:RedHat6.4 + GCC4.4.6

1)在应用boost静态库的过程中,参考了一篇文章,里面提供了-static参数,指定程序使用静态库,指令如下:

g++ 2testboost.cpp -o test -I /usr/local/include/boost/    /root/lib/libboost_system.a  /root/lib/libboost_filesystem.a  -static

在实验机器上,编译出错:/usr/bin/ld: cannot find -lm

大多数的解决方案都是搜索是否存在libm.so文件,而且确实已经在/usr/lib目录下存在。

2)编译一个全静态的程序,添加-static,编译出错如上所示

3)编译一个半静态的程序,添加-static-libgcc,编译出错如上所示

4)添加-static-libstdc++,编译出错如下:g++: 无法识别的选项‘-static-libstdc++’


代码如下:

#include <iostream>

#include <boost/filesystem.hpp>

using namespace boost::filesystem;

int main(int argc, char *argv[])

  if (argc < 2) 

  {    

    std::cout << "Usage: tut1 path\n";    

    return 1;  

  }  

  std::cout << argv[1] << " " << file_size(argv[1]) << std::endl;  

  return 0;
}


编译过程:


静态链接:

 g++ 2testboost.cpp  -I /home/boost/boost_1_49_0/boost/  /home/boost/boost_1_49_0/stage/lib/libboost_system.a /home/boost/boost_1_49_0/stage/lib/libboost_filesystem.a -o 2test 


动态链接:

使用安装之后的目录

g++ 2testboost.cpp -I /usr/local/include/boost/ -L /usr/local/lib -lboost_system -lboost_filesystem -o 2test


使用原有的生成目录

g++ 2testboost.cpp -I /home/boost/boost_1_49_0/boost/ -L /home/boost/boost_1_49_0/stage/lib  -lboost_system -lboost_filesystem -o 2test


如果没有指定安装的目录,运行时候需要ldconfig /home/boost/boost_1_49_0/stage/lib


注意:-L参数指定的目录目前只能够是动态库的目录,每一个静态库都必须填写完整的路径,否则无法链接成功!!


解决方案:

yum install glibc-static

该命令安装静态编译版本的C库。网上有的执行了如下的指令:

#yum install libstc++-static

但是使用yum 安装的时候没有找到相关的安装包,但是同样解决了问题.出现上面问题的原因是GCC的版本不支持,默认情况下安装的是动态的C库,当需要将静态C库链接到程序的时候出现了cannot find -lm的错误。


ldd能够分析出程序依赖的动态库,测试是否是全静态程序:

[root@jack ~]# g++ 2testboost.cpp -o test -I /usr/local/include/boost/    /root/lib/libboost_system.a  /root/lib/libboost_filesystem.a  -static

[root@jack ~]# ldd test

不是动态可执行文件



参考:

http://www.tuicool.com/articles/Ifqm2uM

http://bbs.csdn.net/topics/391880682

http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/



     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1584985,如需转载请自行联系原作者





相关文章
|
2月前
|
开发者 Python
|
4月前
|
编译器 Shell Linux
C语言的本质(六):链接详解-定义和声明
C语言的本质(六):链接详解-定义和声明
49 0
|
1月前
|
小程序 JavaScript
小程序bindtap 和 catchtap 的区别以及如何使用
小程序bindtap 和 catchtap 的区别以及如何使用
26 0
|
25天前
|
前端开发 JavaScript
怎样使用接口引用数据
怎样使用接口引用数据
|
2月前
|
存储 算法 安全
【C/C++ 模板编程 链接问题】 了解和解决模板编程中的链接错误以及正确的模板编写方式
【C/C++ 模板编程 链接问题】 了解和解决模板编程中的链接错误以及正确的模板编写方式
50 1
|
2月前
|
缓存 编译器 程序员
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
46 0
|
12月前
|
设计模式 Java
从零开始:Java中如何定义和访问静态字段和方法
从零开始:Java中如何定义和访问静态字段和方法
133 0
|
Python
Python骚操作:动态定义函数
除了做实验,需要用到动态创建函数的场景很少。 玩耍(Toying around) Python 的内部构件是一种深入学习这门语言的好方法。 如果需要,可以毫不费力地越过解释器/语言的界线。
107 0
|
C语言 C++
C++中的引用和高级函数(上)
C++中的引用和高级函数(上)
C++中的引用和高级函数(下)
C++中的引用和高级函数(下)
C++中的引用和高级函数(下)