Linux下静态库生成和使用
Linux下静态库生成和使用
一.静态库概念
1.库是预编译的目标文件(object files)的集合,它们可以被链接进程序。静态库以后缀为”.a”的特殊的存档(archive file)存储。
2.标准系统库可在目录/usr/lib与/lib中找到。比如,在类Unix系统中C语言的数序库一般存储为文件/usr/lib/libm.a。该库中函数的原型声明在头文件/usr/include/math.h中。
3.C标准库本身存储为/usr/lib/libc.a,它包含ANS1/ISO标准指定的函数,比如printf。对每一个C程序来说,libc.a都默认被链接。
4.一个事例:
在tiger.c程序中调用一个数学库libm.a中sin函数。
#include<stdio.h>
#include<math.h>
int main()
{
double x = 2.0;
double y = sin(x);
printf(“the result:%f\n”,y);
return ;
}
如果直接使用gcc tiger.c则会出现错误:
undefined reference to ‘sin’;
1>函数sin(),未在本程序中定义也不在默认库’libc.a’中,除非被指定,编译器也不会链接’libm.a’。
2>为使编译器能将sin()链接进主程序‘test.c’,需要提供数学库’libm.a’.。
3>使用方法:
gcc tiger.c /usr/lib/libm.a -o tiger
则可以编译通过。为了避免在命令行中指定长的路径,编译器为链接函数库提供了快捷的选项“-l”。因此可以使用下面的方法:
gcc tiger.c -lm –o tiger
注:选项-lNAME使用连接器尝试链接系统库目录中的函数库文件libNAME.a。
二.生成和使用静态库
1.静态库是obj文件的一个集合,通常静态库以”.a”为后缀。静态库由程序ar生成。
2.静态库的优点是可以在不用重新编译程序库代码的情况下,进行程序的重新链接,这种方法节省了编译过程的时间(在编译大型程序的时候,需要花费很长的时间)。静态库的另一个优点是开发者可以提供库文件给使用的人员,不用开放源代码,这是库函数提供者经常采用的手段。
3.通过一个实例来了解如何自己生成静态库和使用静态库
首先生成静态库
1>在test文件夹下有三个文件:main.c ,tiger.c,tiger.h;
a. main.c文件中的内容:
#include<stdio.h>
#include”tiger.h” //注意include该文件,并不是仅链入.a文件即可
int main(void)
{
printf(“sum=%d\n”,add(,));
return ;
}
b.tiger.h文件中的内容:
#ifndef __TIGER__
#define __TIGER__ int add(int a,int b); #endif
c.tiger.c文件中的内容
int add(int a,int b)
{
return a+b;
}
2>创建静态库的最基本步骤是生成目标文件tiger.o
gcc -o tiger.o -c tiger.c
3>然后生成静态库libadd.a:
ar -rcs libadd.a tiger.o
其次使用静态库
1>使用gcc命令带上库文件就OK了
gcc -o main main.c libadd.a
2> 也可以使用命令”-l库名”进行,库名是不包含库函数库和扩展名的字符串。
gcc -o main main.c -ladd
上面的命令执行完后,系统返回:
Cannot find –ladd
说明:上面的命令将在系统默认的路径西安查找add函数库,并把他链接到要生成的目标程序上。系统提示没有找到库文件add,这是由于add库函数没有在系统默认的查找路径下,我们需要认为指定库函数的路径,例如:库文件和当前编译文件在同一目录下: gcc -o main main.c -L ./ -ladd
系统就能正常生成可执行文件。
说明:
在使用-l选项时,-o选项的目的名要在-l链接的库名之前,否则gcc会认为-l是生成的目标而出错。
原文地址:linux下静态库生成和使用
Linux下静态库生成和使用的更多相关文章
- Linux下动态库生成和使用
Linux下动态库生成和使用 一.动态库的基本概念 1.动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的程序都可以使用动态库来运行程序.动态链接库是目标文件的集合,目标文件在动态链接库中 ...
- linux下静态库和动态库一些东西
http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux 动态链接库和静态库示例 文件预览 文件目录树如下, ...
- linux下静态库的制作
在我们编写软件的过程当中,少不了需要使用别人的库函数.因为大家知道,软件是一个协作的工程.作为个人来讲,你不可能一个人完成所有的工作.另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把 ...
- linux下静态库的生成和使用
一.静态库概念 1.库是预编译的目标文件(object files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. 2.标准系统库可在目录/usr ...
- Linux下静态库和动态库
函数库分为静态库和动态库 动态库(格式为libname.so[.主版本号.次版本号.发行号]).在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入. 静态库是目标文件.a的归档文件(格式为 ...
- linux下静态库和动态库的制作
一.静态库 1.编写.c文件,在其中实现函数源代码,同时制作头文件 2.将.c文件转为.o文件 gcc -c xxx.c -o xxx.o 3.将*.o转换成库文件 a ...
- linux上静态库链接的有关问题
求大神,linux下静态库链接的问题有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件, ...
- Windows下静态库与动态库的创建与使用
Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...
- 查看Linux下*.a库文件中文件、函数、变量
查看Linux下*.a库文件中文件.函数.变量等情况在Linux 下经常需要链接一些 *.a的库文件,那怎么查看这些*.a 中包 含哪些文件.函数.变量: 1. 查看文件:ar -t xxx.a 2. ...
随机推荐
- 感谢大家的支持,发布一个JWFD的补丁文件
请用这个文件覆盖原来的JWFD开发包里面的同名文件,然后删除JWFD目录下面的那个FLOWTREE.OBJ 文件 然后重启JWFD.... 这个补丁修正了 流程图设计器-树型列表的几个BUG,因为有 ...
- 【笨嘴拙舌WINDOWS】计时器精度
WINDOWS的大多数系统并非实时操作系统,所以不能规定计算机在某个精确到纳秒的时间让计算机做某项任务,如果规定了时间WINDOWS也将需要在完成了线程调度后,经行任务执行! 也就是说,如果你的应用程 ...
- [ionic开源项目教程] - 第15讲 ionic用户个人中心登录注册的实现
第15讲 ionic用户个人中心登录注册的实现 这一讲包括登陆.注册.个人中心.个人资料页面的实现. 在一讲的改动有四个地方: 在config.js里配置接口地址 完善个人中心的服务层(service ...
- 瞎折腾之 NHibernate ORM框架的接触(MVC + Repository源码)(一)
在这炮火连天.技术更新迅猛的年代,不接触了解.甚至会用2~3种框架都不好意思说自己有多少年工作经验.况且出去面试也会有点吹牛的底子嘛. 这次折腾了NHibernate.其实这些ORM框架封装好了都是给 ...
- android中handler用法总结
一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在handler的线程中 ...
- == Rickard Oberg & TheServerSide
看了Hani Suleiman和Rickard Oberg ,发现其实每个所谓的权威都应该有被质疑的绝对,可能往往权威会令人觉得理所应当
- foreach的指针问题
从代码: $arr = array(,,,,); echo '$arr = array(1,2,3,4,5)','<br>'; foreach($arr as $key => &am ...
- Struts2 的 helloworld
配置步骤: 1.在你的strut2目录下找到例子项目,把它的 lib 下的jar拷贝到你的项目.例如我的:struts-2.3.24\apps\struts2-blank 2.struts-2.3.2 ...
- Android EventBus源码解析
项目地址 :https://github.com/greenrobot/EventBus 这个项目个人感觉就是为了解决回调事件过多的,比方说A函数在做完以后 要调用b类的c函数,那我们通常的做法就是 ...
- 编辑时snapping的添加
原文 编辑时snapping的添加 注意需要在编辑模式下进行snapping的添加(也即先需要使用IEngineEditor进入编辑状态): IMapControl3 mMap = (IMapCont ...