当前位置: 首页 > news >正文

[转]关于Linux 静态库和动态库

Linux下创建静态、动态库

源码

-----------a.cpp---------------
#include <cstdio>
int a(int i)
{
        std::printf("in a(int a) %dn", i);
        return 0;
}

-----------b.cpp----------------
#include <iostream>
int b(char *s)
{
        std::cout<<"in int b(char *s): "<<s<<std::endl;
        return 0;
}
----------main.cpp--------------
#include <cstdio>
using namespace std;
int a(int i);
int b(char *s);
int main()
{
        a(5);
        b("ok");
        printf("in mainn");
        return 0;
}

静态库
1、编译生成a.o b.o 文件
# g++ -c a.cpp b.cpp

2、生成archive 文件libtest.a  c-创建  r-将文件加入libtest.a
#ar rc libtest.a a.o b.o

3、指定静态库libtest.a 进行编译
# g++ -o main main.cpp libtest.a

运行结果
# ./a.out
in a(int a) 5
in int b(char *s): ok
in main

对于libtest.a直接将里面的代码拷贝出来相当于静态编译

动态库
1、编译生成a.o b.o文件   -fPIC生成.o文件时用相对地址实现代码位置无关
# g++ -fPIC a.cpp b.cpp

2、生成动态库libtest.so
# g++ -shared -o libtest.so a.o b.o

3、指定动态库libtest.so进行编译
# g++ main.cpp  ./libtest.so

查看动态连接库
# ldd a.out
        ./libtest.so => ./libtest.so (0x40014000)
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002e000)
        libm.so.6 => /lib/i686/libm.so.6 (0x40071000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

其他
1、动态连接库3时如果
# g++ main.cpp libtest.so
编译可通过但运行出错在默认库路径下找不到libtest.so库
# ./a.out
./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such
file or directory
查看连接库
# ldd a.out
        libtest.so => not found
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002c000)
        libm.so.6 => /lib/i686/libm.so.6 (0x4006f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

2、方便使用可以将静态库libtest.a或者动态库libtest.so拷贝到默认库的查找路径里/lib或者/usr/lib里,
编译时直接
#g++ main.cpp -ltest
-l 自动进行库名称扩展
# ldd a.out
        libtest.so => /usr/lib/libtest.so (0x4002b000)
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002e000)
        libm.so.6 => /lib/i686/libm.so.6 (0x40071000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
静态情况
# g++ main.cpp -ltest
# ldd a.out
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002b000)
        libm.so.6 => /lib/i686/libm.so.6 (0x4006f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

3、静态库中2生成archive后可能需要ranlib libtest.a 将内容的索引写入libtest.a中供ld连接时使用

4、-l选项要放在所编译文件的后面,在前面会出错
# g++ -ltest main.cpp
/tmp/ccbQK3kY.o: In function `main':
/tmp/ccbQK3kY.o(.text+0xc): undefined reference to `a(int)'
/tmp/ccbQK3kY.o(.text+0x1c): undefined reference to `b(char *)'
collect2: ld returned 1 exit status

 

同时以下网址有更多描述:

http://blog.21ic.com/user1/2663/archives/2009/65033.html

http://blog.chinaunix.net/u1/43190/showart_425624.html

http://blog.csdn.net/jiangnanyouzi/archive/2008/11/17/3321150.aspx

http://blog.csdn.net/laomai/archive/2007/02/16/1510957.aspx

http://home.lupaworld.com/home.php?mod=space&uid=56821&do=blog&id=128928

转载于:https://www.cnblogs.com/VRS_technology/archive/2010/09/04/1818099.html

相关文章:

  • muduo 与 libevent2 吞吐量对比
  • TabController控件测试
  • 第13届年度Webby奖采用Silverlight / 13th Annual Webby Awards powered by Silverlight
  • 网页-CSS
  • 王德兴读《吴越品水浒》有感15:吴越对“鲁智深出家”的无知和诬蔑
  • C#读取特定目录下的所有文件
  • debug下运行不成功
  • [转]Apache虚拟目录设置方法
  • 11个IT人士必备的Chrome 插件
  • javascript对象转化成json字符串
  • ffmpeg_intra_pred_mode问题.pdf
  • 全局原子应用之防止程序多开
  • 学习LoadRunner之C语言函数
  • .NET : 在VS2008中计算代码度量值
  • Ctrl+F5运行崩溃,而用F5调试运行没有问题
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android组件 - 收藏集 - 掘金
  • C语言笔记(第一章:C语言编程)
  • JS笔记四:作用域、变量(函数)提升
  • k个最大的数及变种小结
  • Mithril.js 入门介绍
  • Travix是如何部署应用程序到Kubernetes上的
  • 强力优化Rancher k8s中国区的使用体验
  • 设计模式走一遍---观察者模式
  • 世界上最简单的无等待算法(getAndIncrement)
  • 学习笔记TF060:图像语音结合,看图说话
  • 找一份好的前端工作,起点很重要
  • 白色的风信子
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​​​​​​​​​​​​​​Γ函数
  • #宝哥教你#查看jquery绑定的事件函数
  • (a /b)*c的值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .a文件和.so文件
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .Net各种迷惑命名解释
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .skip() 和 .only() 的使用
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [BZOJ2208][Jsoi2010]连通数
  • [CLickhouse] 学习小计
  • [Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。
  • [js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...