Linux环境编译动态库和静态库总结
对Linux环境动态库和静态库的一些基础知识做一些总结,
首先总结静态库的编译步骤。
1 先基于.cpp或者.c文件生成对应的.o文件
2将几个.o文件 使用ar -cr命令 生成libname.a文件
libname.a 为静态库, name 为静态库的名字,
可以根据模块功能命名。
举个例子
在当前目录下,有一个mymethod.h文件
在mymethod.cpp里实现这两个函数
在当前目录下有一个main.cpp文件
为了方便使用,将mymethod.cpp封装成静态库和动态库
首先将mymethod.cpp 编译成目标文件
g++ -c mymethod.cpp -o mymethod.o
然后根据目标文件生成静态库
ar -cr libmymethod.a mymethod.o
ar命令可以用来创建、修改库,也可以从库中提出单个模块
-c 选项表示 创建一个库。不管库是否存在,都将创建
-r 选项表示 将模块插入库,如果库中有对应的模块,那么进行更新
如果把多个.o文件插入库.a里,只需要在后面用空格分开写出来
格式
ar -cr 静态库libname.a name1.o name2.o
静态库的命名有规则,格式为lib+库名+.a
生成静态库libmymethod.a后,
编译main.cpp 连接静态库生成可执行文件main
g++ main.cpp -o main -I ./ -L ./ -lmymethod
-I选项表示头文件路径
-L表示静态库或者动态库的路径
链接静态库写成 -l库名即可:-lmymethod
运行./main 可以输出结果
下面是动态库的编译
动态库的命名是lib+库名+.so
动态库需要使用-shared 选项以及-fPIC选项
g++ -c -fPIC mymethod.cpp -o mymethod.o
-fPIC表示代码是和地址无关的,不需要被不同模块重定位
然后根据目标文件生成动态库.so文件
g++ -shared -o libmymethodso.so mymethod.o
-shared 选项表示生成的是.so动态库文件
下一步是链接动态库
g++ main.cpp -o main -I ./ -L ./ -lmymethodso
此时不能直接运行./main否则会提示找不到对应的动态库
上面的步骤可以直接写成一句话
g++ -shared -fPIC mymethod.cpp -o libmymethodso.so
我们现在有几种方式配置动态库的路径
第一种
export LD_LIBRARY_PATH="./:$LD_LIBRARY_PATH"
这种方式将动态库路径配置到LD_LIBRARY_PATH,只是暂时生效
第二种
使用 ldconfig 机制(需 root 权限):
● 首先,在 /etc/ld.so.conf.d/ 下创建一个 .conf 文件,
如 libmymethod.conf ,内容为共享库所在目录的绝对路径
● 然后,运行 ldconfig
第一种比较简单,配置好后可以直接运行./main
第二种按照操作进入/etc/ld.so.conf.d/,
然后创建mymethod.conf
用vi打开mymethod.conf,添加动态库的绝对路径
/home/secondtonone/soando
最后运行ldconfig, 即可生效了。
这样就可以运行./main
现在对动态库路径配置做一个总结
解决共享库路径问题
gcc/g++ 编译期 :
● 使用 L 选项指定所需链接的共享库所在目录(如果共享库或其连
接文件位于 /usr/lib 、 /usr/local/lib 或由 LD_LIBRARY_PATH 指定
的目录下,则不需指定该选项)
● 使用 l 选项指定所需链接的共享库名称(无前缀、后缀)
程序运行期:
● 使用 LD_LIBRARY_PATH 环境变量来指定所需引用的共享库所在
目录 ( 临时指定或永久性写入相关文件,普遍适用于 UNIX 世界 )
● 使用 ldconfig 机制(需 root 权限):
● 首先,在 /etc/ld.so.conf.d/ 下创建一个 .conf 文件,
如 libmymethod.conf ,内容为共享库所在目录的绝对路径
● 然后,运行 ldconfig
我的公众号,谢谢关注下。
Linux环境编译动态库和静态库总结的更多相关文章
- linux下编译qt5.6.0静态库——configure配置
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- 嵌入式 Linux下编译并使用curl静态库
#x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...
- [转][linux][centos]嵌入式 Linux下编译并使用curl静态库
#x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...
- 自己在linux上编译、链接、动态库和静态库的学习笔记
在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些 ...
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
随机推荐
- Memcached&PHP-Memcache安装配置
参考文档: memcache官网:https://memcached.org/ 参考:http://www.runoob.com/memcached/memcached-install.html 参考 ...
- pager-taglib2.0中文传参乱码问题
1.重现问题 在web项目中有时会用到pager-taglib来作为分页的标签,如上图红色框标识所示,当我们需要把页面参数保持的时候我们会在<pg:param />标签中把参数进行传递. ...
- BVT与冒烟测试
[BVT的释义] BVT的全称是Build Verification Test.可以说这个全称就是BVT的定义了. BVT只验证build构建的成功与失败,不深入测试构建好的build的功能.性能等等 ...
- USACO 1.4.2 Mother's Mil 母亲的牛奶(DFS)
Description 农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装 ...
- 互评Alpha版本——杨老师粉丝群——Pinball
一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题 (1)N(Need,需求) 成语学习对除汉语言专业外的大学生的需求并不是很高,初中生和高中生因为在升学时需要参加语文 ...
- 《Linux内核与分析》第五周
20135130王川东 一.给MenuOS增加time和time-asm命令 命令:1.强制删除:rm menu -rf 2.克隆:git clone (后跟需要克隆数据所在的位置) 3.自动编译,自 ...
- ACM 第二十天
积性函数.杜教筛 练习题 莫比乌斯函数之和 51Nod - 1244 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号. ...
- 敏捷开发之Scrum站立会议
Scrum是迭代式增量软件开发过程,通常用于敏捷开发.站立会议通常指Scrun方法中的每日站立会议.顾名思义,是每天以站姿的方式召开的会议.以下从功能及要点方面对其进行解释说明: 功能: 1. ...
- 【php】set_include_path和get_include_path用法详解
目的:在框架中方便加载文件 参考:http://blog.sina.com.cn/s/blog_4ce89f200100twbl.html 如果我们没有设置这个值,可能我们需要写一些完全的路径: ...
- 20个PHP程序性能优化的方法
1.数据库连接当使用完毕时应当关闭,不要使用长连接. 2.用@屏蔽错误消息的做法非常低效,极其低效. 3.使用选择分支语句(switch case)好于使用多个if,else if. 4.$row[' ...