一.静态库概念

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 0;
}

如果直接使用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(3,5));
return 0;
}

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是生成的目标而出错。

原文:

https://blog.csdn.net/tigerjibo/article/details/6989689

最新文章

  1. 怎么让composer加速
  2. JVM内存结构、垃圾回收那点事
  3. Wordpress基础:文章和页面的区别
  4. 转:HTML5标准与性能之四:asm.js
  5. C#_wpf_userinput_数据绑定_后台对象改变,界面数据也变化
  6. Django1.7.1设置TEMPLATE_DIRS
  7. pragma指令简介
  8. NYOJ 12 喷水装置(二)
  9. HDOJ 4607 - Park Visit
  10. STL笔记之【map之总概】
  11. vscode小程序代码高亮
  12. ARM LCD屏调试3--屏的应用编程
  13. ubuntu16.04安装tensorflow1.3
  14. 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
  15. selenium常用命令
  16. 浅谈期望的线性性(可加性)【CodeForces280c】【bzoj3036】【bzoj3143】
  17. Python实现简单的API接口
  18. vue使用vue-resource,进行网络请求
  19. lua连接数据库操作示例代码
  20. xshell 没有反应---Xshell按ctrl+s界面无反应的解决办法

热门文章

  1. python中的and、or 操作符
  2. nodejs-EventEmitter
  3. 工具-VS CODE快捷键
  4. 洛谷—— P1204 [USACO1.2]挤牛奶Milking Cows
  5. Qt Quick 之 QML 与 C++ 混合编程具体解释
  6. POJ 2189
  7. 程序猿爱情表白专用html5动画网页的代码
  8. hdu 4603 Color the Tree
  9. redis 五大数据类型的常用指令
  10. linux + nginx 的配置优化