本文共 1885 字,大约阅读时间需要 6 分钟。
场景说明: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/