库是一种软件组件技术,库里面封装了数据和函数。

库的使用可以使程序模块化。

Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。

Linux通常把库文件存放在/usr/lib或/lib目录下。

Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀。

在程序中使用使用静态库和动态库时,他们载入的顺序是不同的。

静态库的代码在编译时就拷贝的应用程序中,这样的优点是节省编译时间。

动态链接库时程序在开始运行后调用库函数时才被载入。

静态库,也称为归档文件(archive),按照惯例它们的名字都以 .a 结尾。比如,标准C语言函数库 /usr/lib/libc.a 和 X11 函数库 /usr/x11/lib/libx11.a .

我们可以容易地创建和维护自已的静态库,只要使用 ar 程序和 gcc -c命令对函数进行分别编译就可以了。

静态库的创建和使用:

1、在一个头文件种声明静态库所导出的函数。

2、在一个源文件种实现静态库所导出的函数。

3、编译源文件,生成可执行代码。

4、将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库文件的目录下。

下面通过一个例子来说明:mylib.h种存放的是静态库提供给用户使用的函数的声明,mylib.c实现了mylib.h种声明的函数。

/*mylib.h*/
#ifndef _MYLIB_H_
#define _MYLIB_H_ void weclome(void);
void outString(const char *str); #endif
/*mylib.c*/

#include "mylib.h"
#include void welcome(void)
{
printf("welcome to libmylib\n");
} void outString(const char *str)
{
if(str != NULL)
printf("%s\n", str);
}

1、编译mylib.c:产生要包含在库文件中的目标。这通过调用带有 -c 选项的 C 语言编译器来实现。-c 选项的作用是阻止编译器创建一个完整的程序。

gcc -o mylib.o -c mylib.c

2、将目标文件加入到静态库中:创建并使用一个库文件。 我们用 ar 程序创建一个归档文件并将目标文件添加进去。这个程序之所以称为 ar,是因为它将若干个单独的文档归并到一个大的文件中以创建归档文档或集合。注意,我们也可以用 ar 程序来创建任何类型文件的归档文件 (请注意,ar 只是一个通用工具.)

ar rcs libmylib.a mylib.o

3、将静态库copy到Linux的库目录(/usr/lib或者/lib)下:

cp libmylib.a /usr/lib/libmylib.a

编写调用库函数的测试程序test.c:

#include "mylib.h"
#include int main(void)
{
printf("create and use library:\n");
welcome();
outString("it's successful\n"); return 0;
}

4、使用静态库编译:

gcc -o testtest.c -l mylib

这里注意,编译时无需带上前缀和后缀。

5、运行可执行程序

test: ./test
create and use library:
welcome to libmylib
it's successful

在Linxu下,可以使用ar命令来创建和修改静态库。

这些在linux下man ar一下就可以得到参数,这里说明几个常用的

d:从库中删除成员文件。

r:在库中加入成员文件,若存在,则替换。

c:创建一个库。

s:无论ar命令是否修改了库内容,都强制重新生成库符号表。

其他的命令可是使用man查看。

C语言的本质(34)——静态库的更多相关文章

  1. C/C++生成静态库动态库及语言交互

    C++静态库与动态库(比较透彻) Go中调用C的动态库与静态库 我的示例 文件结构 |- sample |- c |- libsample |- libsample.h |- libsample.cp ...

  2. C语言动态库和静态库的使用及实践

    转自:https://www.cnblogs.com/CoderTian/p/5902154.html  1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接 ...

  3. C语言学习笔记--动态库和静态库的使用

    1.C语言中的链接器 (1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件. (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正 ...

  4. Python语言、编译解释、动态库静态库、编译过程、头文件

    学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...

  5. C语言中静态库和动态库笔记

    库 库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用. 程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用, 其过程具有一定的模块化.封装.抽象的特征. 按照库的使用方式, ...

  6. UNIX环境下用C语言写静态库与动态库

    静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS ...

  7. codeblocks创建和使用静态库(C语言)

    静态库  (扩展名为 .a 或 .lib) 是包含函数的文件,用于在link阶段整合执行程序,动态链接库(扩展名  .dll)是不在link阶段整合进执行程序中的. DLL文件在执行阶段动态调用 下面 ...

  8. C语言的本质(35)——共享库

    库用于将相似函数打包在一个单元中.然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法- 即,从模块中构建程序.Linux支持两种类型的库,每一种库都有各自的优缺点.静态库包含在编译时静 ...

  9. golang 编译或链接 c语言动态、静态库的方法, golang 与 c语言 相互调用

    1.golang链接c静态库的方法可以见这个示例: https://github.com/atercattus/go-static-link-example https://github.com/sh ...

随机推荐

  1. UVa 11401 三角形的个数

    题意:由1,2,3...n组成的序列中找三个数,且以这三个数为变长能组成三角形,求这样的三角形个数. 思路:当每次输入n时重新都计算一遍会TLE...先预处理,将结果存入ans数组. 代码: #inc ...

  2. php引用计数与变量引用

    每个php5.5变量都存储在一个叫做zval的变量容器中. 一个zval变量容器,除了包含变量的类型与值外,还包含两个字节的额外信息: 1.第一个是“is_ref”,是个bool型,用来标识这个变量是 ...

  3. Linux配置FTP服务器

    基于CentOS-6.5 1.先查看是否已安装:rpm -qa vsftpd 或 rpm -ql vsftpd 2.安装:yum install vsftpd -y 3.设置开机启动: chkconf ...

  4. Gym Class(拓扑排序)

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  5. 再一次强调,ORACLE外键必须加索引

    外键加索引是常识,必须牢记.本来不想写这样的简单案例.可是连续遇到好几起外键不加索引导致性能问题,所以还是写一下. 一个兄弟问我 delete from Sa_Sales_Comm_Detail s  ...

  6. unity3d 建树篇

    今天碰到有人问这个问题,然后我经过一番折腾,找到了方法.例如以下: 有学过Unity3d的同学生都知道我们在对地形拖拉树木等表层时,其树木在我们实例执行中,它们都是能够任其他物体穿过. 这是为什么.相 ...

  7. [Hapi.js] Route parameters

    Routing is a fundamental aspect of any framework. In this lesson, you'll learn how to use path param ...

  8. linux在文件打包和压缩

    1. 打包和压缩文件 linux现在经常使用gzip和bzip2要压缩的文件.tar压缩文件. 经常使用的扩展: *.gz   gzip压缩文件 *.bz2  bzip2压缩的文件 *.tar   t ...

  9. EffectiveC#1--尽可能的使用属性(property),而不是数据成员(field)

    1.属性可以进行数据绑定 2.可以做数据安全校验.在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决 如下代码不可取 public string Name { get { if(thi ...

  10. windows2008无线网卡和.net3.5安装

    今天在联想T420S笔记本上安装windows2008标准版,安装完成后部分驱动软件不能安装,要求.net framework3.5,下载.net3.5安装时提示应该用角色管理器安装. 根据提示打开服 ...