Linux静态库生成指南

 

Linux上的静态库,其实是目标文件的归档文件。
在Linux上创建静态库的步骤如下:

  1. 写源文件,通过 gcc -c xxx.c 生成目标文件。
  2. 用 ar 归档目标文件,生成静态库。
  3. 配合静态库,写一个使用静态库中函数的头文件。
  4. 使用静态库时,在源码中包含对应的头文件,链接时记得链接自己的库。

下面通过实例具体讲解。

写源文件,生成目标文件。

第一个源文件 my_print.c

#include <stdio.h>

void cout(const char * message)
{
fprintf(stdout, "%s\n", message);
}

源文件2: my_math.c

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

使用gcc,为这两个源文件生成目标文件:

gcc -c my_print.c my_math.c

我们就得到了 my_print.o 和 my_math.o。

归档目标文件,得到静态库。

我们使用 ar 将目标文件归档:

ar crv libmylib.a my_print.o my_math.o

我们就得到了libmylib.a,这就是我们需要的静态库。

上述命令中 crv 是 ar的命令选项:

  • c 如果需要生成新的库文件,不要警告
  • r 代替库中现有的文件或者插入新的文件
  • v 输出详细信息

通过 ar t libmylib.a 可以查看 libmylib.a 中包含的目标文件。

可以通过 ar --help 查看更多帮助。

注意:我们要生成的库的文件名必须形如 libxxx.a ,这样我们在链接这个库时,就可以用 -lxxx
反过来讲,当我们告诉编译器 -lxxx时,编译器就会在指定的目录中搜索 libxxx.a 或是 libxxx.so

生成对应的头文件

头文件定义了 libmylib.a 的接口,也就是告诉用户怎么使用 libmylib.a。

新建my_lib.h, 写入内容如下:

#ifndef __MY_LIB_H__
#define __MY_LIB_H__ int add(int a, int b);
int subtract(int a, int b); void cout(const char *);
#endif

测试我们的静态库

在同样的目录下,建立 test.c:

#include "my_lib.h"

int main(int argc, char *argv[])
{
int c = add(15, -21);
cout("I am a func from mylib ...");
return 0;
}

这个源文件中引用了 libmylib.a 中的 cout 和 add 函数。

编译test.c:

gcc test.c -L. -lmylib

将会生成a.out,通过 ./a.out 可以运行该程序。说明我们的静态库能正常工作。

上面的命令中 -L. 告诉 gcc 搜索链接库时包含当前路径, -lmylib 告诉 gcc 生成可执行程序时要链接 libmylib.a

通过makefile自动化

上面的步骤很繁琐,还是写个简单的makefile吧,内容如下:

.PHONY: build test

build: libmylib.a

libmylib.a: my_math.o my_print.o
ar crv $@ my_math.o my_print.o my_math.o: my_math.c
gcc -c my_math.c my_print.o: my_print.c
gcc -c my_print.c test: a.out a.out: test.c
gcc test.c -L. -lmylib

makefile写好后,运行 make build 将会构建 libmylib.a, 运行 make test 将会生成链接 libmylib.a 的程序。

如果你在 windows 上使用 mingw,和Linux下生成静态库的方法是一样的。

 
分类: Linux开发
标签: Linuxgcc
 

Linux静态库生成指南的更多相关文章

  1. Linux静态库生成

    Linux上的静态库,其实是目标文件的归档文件. 在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生成静态库. 配合静态库,写一 ...

  2. Linux动态库生成与使用指南

    相关阅读: Linux静态库生成指南 Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不 ...

  3. linux静态库的生成与使用(转)

    linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...

  4. Linux下静态库生成和使用

    Linux下静态库生成和使用 一.静态库概念 1.库是预编译的目标文件(object  files)的集合,它们可以被链接进程序.静态库以后缀为”.a”的特殊的存档(archive file)存储. ...

  5. Linux静态库与动态库详解

    引言 为了代码的复用性和模块化,我们常常使用一些库文件,在Windows操作系统下位.lib .dll作为静态库和动态库的后缀名. 在Linux下,静态链接库名字一般为libabcdef.a,其中ab ...

  6. Linux 静态库(.a)转换为动态库(.so)

    Linux 静态库转换为动态库 参考 http://blog.csdn.net/moxuansheng/article/details/5812410 首先将.a文件转为.so文件是可以实现的 原因是 ...

  7. Linux 静态库 & 动态库

    转自:http://blog.chinaunix.net/uid-26833883-id-3219335.html 一.什么是库   本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执 ...

  8. 关于Linux静态库和动态库的分析

    关于Linux静态库和动态库的分析 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可运行代码的二进制形式.能够被操作系统加 ...

  9. iOS 静态库生成(引用第三方SDK、开源库、资源包)

    一.静态库创建 打开Xcode, 选择File ----> New ---> Project  选择iOS ----> Framework & Library ---> ...

随机推荐

  1. leetcode 235. Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  2. hdu5175 gcd 求约数

    题意:求满足条件GCD(N,M) = N XOR M的M的个数 sol:和uva那题挺像的.若gcd(a,b)=a xor b=c,则b=a-c 暴力枚举N的所有约数K,令M=NxorK,再判断gcd ...

  3. PHP的几个常用加密函数

    在php的开发过程中,常常需要对部分数据(如用户密码)进行加密 一.加密类型: 1.单向散列加密 就是把任意长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出 ...

  4. nginx中SSI问题的研究

    最近感觉挺爽的,这个项目团队没有一个专门做PHP的,我是第一个进来做PHP(当然还有前端)的,哈哈,我会设计修改出适合我们业务的PHP框架,哈哈,感觉会学到很多东西的样子,前几天在组内20几个前辈面前 ...

  5. As环境下添加android support library依赖库

    2015年的google大会上,google发布了新的Android Support Design库的新组件之一,以此来全面支持Material Design 设计风格的UI效果,为了可以使用这些新颖 ...

  6. AngularJs angular.uppercase、angular.lowercase、angular.fromJson、angular.toJson

    angular.uppercase 将指定的字符串转换成大写 格式:angular.uppercase(string); string:被转换成大写的字符串. 使用代码: var str = &quo ...

  7. linux 下各文件夹的功能性介绍。(转载)

    原文来自:http://www.cnblogs.com/wen858636827/archive/2012/12/26/2834373.html /opt   放置用户自己下载的软件  英文全称是op ...

  8. HDU1698Just a Hook(线段树 + 区间修改 + 求和)

    题目链接 分析:1-N区间内初始都是1,然后q个询问,每个询问修改区间[a,b]的值为2或3或者1,统计最后整个区间的和 本来想刷刷手速,结果还是写了一个小时,第一个超时,因为输出的时候去每个区间查找 ...

  9. response压缩响应

    思路:1.通过filter向目标页面传递一个自定义的response对象 2..在这个response对象中通过重写getOutputStream方法和getWriter方法使目标资源调用 该方法输出 ...

  10. js024-最佳实践

    js024-最佳实践 本章内容: 可维护的代码 保证代码性能 部署代码 24.1 可维护性 24.1.1 代码的可维护性 代码可维护性的特征: 特性 说明 可理解性 其他人可以理解它的用途和一般途径 ...