linux静态库
库文件可以理解为别人写好的现成的代码,但是看不见源码,只提供程序入口。库又分为动态库和静态库,静态库是在编译的时候将库编译进可执行程序中,运行时不再依赖库文件,而动态库是在运行时加载,运行时需要依赖库文件。静态库以libxxx.a命名,动态库以libxxx.so命名。
比如编写两个文件,hello.c和main.c,源码如下:
hello.c
1 #include <stdio.h>
2
3 void hello(void)
4 {
5 printf("Hello World\n");
6 }
main.c
1 extern void hello(void);
2
3 int main(int argc, const char *argv[])
4 {
5 hello();
6
7 return 0;
8 }
可以用gcc hello.c main.c 命令将两个文件编译成一个可执行文件,但是如果我不希望hello.c中的源代码被人看到,我就会将hello.c制作成库文件。
生成静态库
执行命令:gcc -c hello.c -o hello.o 得到hello.o文件
执行命令:ar crs libhello.a hello.o 得到libhello.a文件,ar命令的具体解释可以参照这篇博客:https://blog.csdn.net/hxg130435477/article/details/8217247
这时就可以使用libhello.a文件了,执行命令:gcc main.c -L. -lhello -o hello
得到可执行文件hello。
需要注意的几个地方:
1、使用ar命令生成的静态库需要由.o文件生成,如果使用命令ar crs libhello.a hello.c 也能生成名为libhello.a的文件,但生成的libhello.a不能用,编译时会报错:
“could not read symbols: Archive has no index; run ranlib to add one collect2: ld returned 1 exit status”
2、生成的.a文件一定要以lib开头,比如libhello.a,而在指定库名时却不能加上最前面的“lib”,否则编译时会都提示找不到库。
ar crs libhello.a hello.o //正确
ar crs hello.a hello.o //错误
gcc main.c -L. -lhello //正确
gcc main.c -L. -llibhello //错误
3、-L用于指定库的路径,与路径之间可以用空格隔开,也可以不用空格。-l用于指定库名,与库名之间可以用空格隔开,也可以不用
gcc main.c -L. -lhello //正确
gcc main.c -L . -l hello //正确
4、如果使用-L指定的路径中没有-l指定的库,或者编译时不加-L参数,那么编译器会去系统默认的库路径中寻找,默认路径为/lib。测试的时候将libhello.a拷贝到/usr/lib或者/lib目录下,测试完之后删除该文件需要使用:sudo rm -f
同时编译多个文件
假设存在3个文件,hello.c,how.c和main.c,在当前路径下生成了hello.o,libhello.a,how.o,libhow.a,只编译c文件可以用:
gcc main.c hello.c how.c
how.c 和libhello.a
gcc main.c how.c -L . -lhello
libhow.a和libhello.a
gcc main.c -L . -lhello -lhow
上面这种情况由于libhello.a和libhow.a在同一路径,所以只需要使用-L指定一次路径,而如果这两个文件不在同一个路径,那么就需要分别用-L指定路径,比如libhello.a在./dir目录下时:
gcc main.c -L . -lhow -L ./dir -lhello
多个文件合并
1、将多个.o文合并为一个.a文件:
ar crs libnew.a hello.o how.o
gcc main.c -L . -lnew
2、将.o文件加入.a文件:
ar crs libhello.a how.o
3、将多个.a文件合并为一个新的.a文件
ar crs libhello.a hello.o
ar crs libhow.a how.o
ar crsT libnew.a libhello.a libhow.a
gcc main.c -L. -lnew
注意执行前要先删掉所有的.a文件,第三步中要加参数"T",否则生成的libnew.a不能使用,编译不过,如果说第3步没有加“T”参数,在不删除.a的情况下重复执行123步,得到的libnew.a也不能使用。原因需要看ar命令和它的参数,在这里不作具体分析。
linux静态库的更多相关文章
- linux静态库的生成与使用(转)
linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...
- Linux静态库生成指南
Linux静态库生成指南 Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生 ...
- Linux 静态库(.a)转换为动态库(.so)
Linux 静态库转换为动态库 参考 http://blog.csdn.net/moxuansheng/article/details/5812410 首先将.a文件转为.so文件是可以实现的 原因是 ...
- 关于Linux静态库和动态库的分析
关于Linux静态库和动态库的分析 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可运行代码的二进制形式.能够被操作系统加 ...
- Linux静态库和共享库
1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...
- Linux静态库和动态库
Linux 工具 ❑ GCC: The GNU Compiler Collection, containing the GNU C compiler❑ G++: A C++ compiler, inc ...
- Linux 静态库与动态库搜索路径设置详解【转】
原文地址:http://blog.chinaunix.net/uid-29025972-id-3855495.html 1. 连接和运行时库文件搜索路径的设置 库文件在连接(静态库和共享库)和运行(仅 ...
- Linux 静态库和动态库 使用说明
Linux下程序运行中,有两种库,静态库和动态库. 静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...
- 详细讲解 关于Linux静态库和动态库的分析
基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...
- Linux 静态库与共享库的使用
申明: 正如题如示,本篇讲的是Linux下是静态库与共享库,而Window下的动态链接库详细情况可见这篇文章:windows动态链接库 DLL 浅析.虽然原理,思想差不多,但是细节却各有不同. 一.静 ...
随机推荐
- JS拼接字符串太长希望换行保持html格式拼接的方法
1. 通常情况 tabPeoStr +='<tr class="tabPeo"><td>'+data[i].name+'</td><td& ...
- sklearn: CountVectorize处理及一些使用参数
sklearn: CountVectorize处理及一些使用参数 CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法.对于每一个训练文本,它只考虑每种词汇在该训练文本中出 ...
- .net core 和 WPF 开发升讯威在线客服与营销系统:(插曲)一次端口攻击行为的分析与应对
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...
- Spring Cloud 各个组件角色简介
概述 SpringCloud 是一个全家桶式的技术栈,包含了很多组件:包含 Eureka.Ribbon.Feign.Zuul .Hystrix等.每个组件完成对应的功能 组件介绍 - 服务发现 Eur ...
- java中产品分类返回给前台页面 后台数据组装
public ResultBean getSpfl(Integer yyb) { ResultBean res = new ResultBean(); try { JSONArray data = n ...
- Liunx运维(九)-Liunx进程管理命令
文档目录: 一.ps:查看进程 二.pstree:查看进程状态树 三.pgrep:查找匹配条件的进程 四.kill:终止进程 五.killall:通过进程名终止进程 六.pkill:通过进程名种植进程 ...
- java容器-Iterator
1介绍 java中的容器主要是Collection<E>的子类型,即都实现了Iterable<E>接口,即使是Map类型,也有entrySet方法可以获得该Map的所有元素组成 ...
- spark使用idea向yarn提交报错:Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
解决方法: 找到1.19版本放到spark的jars目录下
- 电脑加载有文件的CD、DVD驱动器图标修改
CD的图标有一定限制,不知道你说的是有盘状态还是默认的状态.插入光盘状态:用autorun.inf格式:[autorun]open=Install.exe 点击光盘时的起动程序icon=Autorun ...
- 项目实战--Stream流实现字符串拼接
需求说明 概述:前端页面查询列表中有个"二级类目"的多选下拉框,用户选择二级类目后,需要从后台数据库查询条件内的数据. 目标:将前端页面传入后端的字符串例如"女性护理, ...