场景说明: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

#include

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/