全静态标准库链接方式

简介:

场景说明: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,如需转载请自行联系原作者





相关文章
|
3月前
|
编译器 Shell Linux
C语言的本质(六):链接详解-定义和声明
C语言的本质(六):链接详解-定义和声明
42 0
|
2月前
|
JavaScript 前端开发 编译器
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)
61 0
|
10天前
|
存储 程序员 编译器
c++面向对象概述、内存分析、引用、函数
c++面向对象概述、内存分析、引用、函数
|
27天前
|
存储 算法 安全
【C/C++ 模板编程 链接问题】 了解和解决模板编程中的链接错误以及正确的模板编写方式
【C/C++ 模板编程 链接问题】 了解和解决模板编程中的链接错误以及正确的模板编写方式
40 1
|
29天前
|
缓存 编译器 程序员
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
34 0
|
3月前
|
Go
Go语言导出包解密:外部访问你的类型和值
Go语言导出包解密:外部访问你的类型和值
29 0
|
3月前
|
JavaScript 前端开发 编译器
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)(下)
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)
26 0
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)(下)
|
3月前
|
JavaScript
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)(上)
TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)
30 0
|
8月前
|
C语言
【文件处理】C语言引用外部文件教程
【文件处理】C语言引用外部文件教程
201 0
|
10月前
|
存储 编译器 程序员
【C语言】存储类别(作用域、链接、存储期)、内存管理和类型限定符(主讲const)(一)
关键字:auto、extern、static、register、const、volatile、restricted、_Thread_local、_Atomic 函数:rand()、srand()、time()、malloc()、calloc()、free() 如何确定变量的作用域(可见的范围)和生命期(它存在多长时间) 设计更复杂的程序