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

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

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. Ubuntu 16.04 LTS 正式发布:系统将持续更新5年

    Canonical 刚刚正式发布了Ubuntu 16.04 LTS (Xenial Xerus),这是一个长期支持版本,官方会提供长达5年的技术支持(包括常规更新/Bug修复/安全升级),一直到202 ...

  2. ECharts 使用实例

    HTML与JavaScript代码: <%@ page language="java" contentType="text/html; charset=UTF-8& ...

  3. 沙湖王 | 用Scipy实现K-means聚类算法

    沙湖王 | 用Scipy实现K-means聚类算法 用Scipy实现K-means聚类算法

  4. 如何在自定义Listener(监听器)中使用Spring容器管理的bean

    正好以前项目中碰到这个问题,现在网上偶然又看到这个问题的博文,那就转一下吧. 原文:http://blog.lifw.org/post/46428852 感谢作者 另外补充下:在web Server容 ...

  5. servlet基本概念

    一.servlet是一个供其它java程序调用的java类,比方tomcatserver,它不能独自执行,它的执行由servlet引擎来控制和调度. 二.servlet是单例,多线程 针对多个clie ...

  6. boost 无锁队列

    一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...

  7. iOS:UI系列之UIScrollview和UIPagecontrol

    转眼间,又是一天,就这样忙忙碌碌的一天一天的过着, 不过还好,不是浑浑噩噩的,也算是小有所成,劳有所获吧,嘿嘿! 好了,到了总结的时间啦, 下面就为大家简单讲解下我今天学习的内容吧,希望对各位都有所帮 ...

  8. 数据库的四种语言(DDL、DML、DCL、TCL)

    1.DDL (Data Definition Language )数据库定义语言 statements are used to define the database structure or sch ...

  9. IoC容器Autofac之实例引入(一)

    先不必尝试理解IOC,先来看段代码. 一.一个没有使用IoC的例子 public class MPGMovieLister { public Movie[] GetMPG() { var finder ...

  10. COM口,串行通讯端口,RS-232接口 基础知识

    COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连 ...