库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)

静态库

之所以称为“静态库”,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

特点

  • 可以实现共享代码
  • 不能再包含其他静态链接库
  • 本身包含了代码,地址符号表等,静态链接库的使用中,连接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中
  • 代码装载速度快,执行速度略比动态链接库快
  • 只需保证在开发者的计算机中有正确的 .a 文件,在以二进制形式发布程序时不需考虑在用户的计算机上 .a 文件是否存在及版本问题
  • 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

创建

  1. 编写源文件,通过 gcc -c xxx.c 生成目标文件
  2. 使用 ar 命令归档目标文件,生成静态库
  3. 配合静态库,写一个使用静态库中的函数的头文件
  4. 链接静态库,生成可执行文件

例子

源文件

add.c 文件:

int add(int a, int b)
{
return a + b;
}

subtract.c 文件:

int subtract(int a, int b)
{
return a - b;
}

编译两个文件,生成目标文件 add.o subtract.o

gcc -c add.c subtract.c

归档目标文件,生成静态链接库 libmath.a

使用 ar 命令将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索

ar rcv libmath.a add.o subtract.o

有关 ar 命令的使用,makepage 有详细的说明,常用的选项是:

c -- 如果库文件不存在,生成新的库文件,并不打印警告
r -- 代替库中已有的文件或者插入新的文件
v -- 输出详细信息
d -- 删除库中的某个目标文件
t -- 列出归档文件中包含的目标文件

我们生成的库文件名字必须形如 libxxx.a,这样我们在链接库的时候,就可以使用 -lxxx。

当我们链接时,指定 -lxxx,链接器就会在指定的目录查找 libxxx.a 或 libxxx.so 文件

编写头文件 mymath.h

#ifndef _MYMATH_H_
#define _MYMATH_H_ int add(int, int);
int subtract(int, int); #endif

使用静态库

编写文件 main.c

#include <stdio.h>
#include "mymath.h" int main()
{
printf("%d, %d\n", add(, ), subtract(, )); return ;
}

编译链接

gcc main.c -L. -lmath

这里,-L 指定搜索链接库的包含当前目录

使用Makefile

.PHONY: all
all: build target build: libmath.a libmath.a: add.o subtract.o
ar rc $@ add.o subtract.o add.o: add.c
gcc -c $<
subtract.o: subtract.c
gcc -c $< target: a.out
a.out: main.c
gcc main.c -L. -lmath .PHONY: clean
clean:
rm *.o libmath.a a.out

linux静态链接库的更多相关文章

  1. Linux 静态链接库和动态连接库

    (0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...

  2. linux静态链接库与动态链接库详解

    一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(e ...

  3. linux 静态链接库demo

    目录结构 ./main.c        #include<stdio.h> #include "./lib/jtlib1.h" int main() {     pr ...

  4. linux c静态链接库与动态链接库

    库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...

  5. Linux下动态链接库和静态链接库

    第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...

  6. Linux环境下c语言静态链接库和动态链接库创建和使用

    库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...

  7. linux动态链接库和静态链接库

    Linux下静态链接库与动态链接库的区别 引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件 (object file)与牵涉到的函数库(librar ...

  8. linux下静态链接库和动态链接库

    关于链接库的知识,网上太多资料了,但是并不代表我很熟悉.今天遇到了 一个问题,就是由于静态链接库和ubuntu系统不兼容导致的,虽然花了点时间才搞定 但是,其中暴露的问题也不少. 没有区分好静态链接库 ...

  9. C/C++ 静态链接库(.a) 与 动态链接库(.so)

    平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的.但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了! 库有两种, ...

随机推荐

  1. c# HttpWebRequest与HttpWebResponse

    [转]c# HttpWebRequest与HttpWebResponse 绝技 如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧. 本文章会对Http请求时的Get和 ...

  2. Beta版本 为什么程序员总是分不清万圣节和圣诞节?因为 Oct 31 == Dec 25。

    Beta版本 软件的测试版本,经常在各类著名软件中的前期发布版本的后缀中可见,包括大名鼎鼎的windows系统,这个阶段的版本一直加入一些新的功能. 软件测试可分为alpha测试.beta测试和联合测 ...

  3. TFS--解决新创建的windows用户无法访问TFS的问题

    今天入职新同事,帮忙配置TFS的账号碰到一个问题,TFS账号是映射取administrators组得 所以新建用户之后,无法马上引入TFS.查询原因是 Builtin组中没有该账号,以前也总是碰到新加 ...

  4. UEditor 中配置可以跨域访问的图片路径

    文档里很清楚:http://fex.baidu.com/ueditor/#server-path 进入配置文件 当域名不是直接配置到项目根目录时,例:http://a.com/b/c  域名下有两文件 ...

  5. Using the @synchronized Directive

    https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/ThreadSafe ...

  6. mvc读书笔记

    在mvc3的時候引入了Razor.Mvc4中默認的頂級目錄/controllers 保存那些處理URL請求的controller類/models 保存那些表示和操縱數據以及業務對象的類/views 保 ...

  7. 几句代码简单实现IoC容器

    前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...

  8. Servlet是线程安全的吗

    Servlet默认是单例模式,在web容器中只创建一个实例,所以多个线程同时访问Servlet是不安全的. 解决此类问题的办法是: 只要Servlet实现 SingleThreadModel 接口

  9. python入门基础:文件的读写

    文件的读写操作运用广泛,无论是何种语言都会涉及到文件的输入输出. 下面简单的总结一下文件的读写: 1:open()函数 f = open('workfile', 'w') 函数 open()返回文件的 ...

  10. 在ASP.NET Core中怎么使用HttpContext.Current (转载)

    一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目 ...