0. 回顾一下 gcc 选项

==============================================

-E : 仅做预处理,例如去注释,宏展开,include 展开等

-S : 将源程序编译为汇编代码 *.s

-c :  预处理,汇编,生成目标文件 *.o

-o :  预处理,汇编,链接,生成可执行 ELF 文件

==============================================

-g :  编译时加入调试信息

-Wall : 编译时显示所有告警

-std=c99 : 编译时支持 c99 语法

-I directory : (i) 加入头文件搜索目录

-lxxx : (L) 链接静态库或动态库

==============================================

1. 创建和使用静态库

- 库文件 arithmetic.c

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }

- 头文件 arithmetic.h

#ifndef ARITHMETIC_H_
#define ARITHMETIC_H_extern int add(int, int);
extern int sub(int, int);
extern int mul(int, int);
extern int div(int, int);#endif

- 主测试文件 use_arithmetic_lib.c

#include "arithmetic.h"
#include <stdio.h>int main(void)
{int x, y;printf("Enter two integers: ");scanf("%d%d", &x, &y);printf("add is: %d\n", add(x, y));printf("sub is: %d\n", sub(x, y));printf("mul is: %d\n", mul(x, y));printf("div is: %d\n", div(x, y));return 0;
}

生成静态库步骤:

1)编译 arithmetic.c 为目标文件,生成 arithmetic.o

$ gcc -c arithmetic.c

2)将 arithmetic.o 转换为静态库文件(注意,库文件命名规则,libxxx.a)

$ ar rcs libarithmetic.a arithmetic.o

使用静态库:

方法1:$ gcc use_arithmetic_lib.c -static ./libarithmetic.a -o use_arithmetic_lib

方法2:$ gcc use_arithmetic_lib.c -L. -larithmetic -o use_arithmetic_lib               # -L 指定静态库文件路径

对于静态库,编译完成后,可执行文件可以脱离静态库运行。但是设想一下,如果一个静态库被调用很多次,则在内存中有这个库很多重复的加载,这是引入动态库的原因之一。以下介绍动态库。

2. 创建和使用动态库

(使用和上述静态库同样的c代码)

生成动态库步骤:

1)编译 arithmetic.c 为目标文件,生成 arithmetic.o

$ gcc -c arithmetic.c

2)将目标文件转换成动态库文件 (注意动态库文件的命名规则 libxxx.so.major.minor)

$ gcc -fPIC -shared -o libarithmetic.so.0.1 arithmetic.o

以上两步可以合在一起,

$ gcc -fPIC -shared -o libarithmetic.so.0.1 arithmetic.c

3)将动态库文件拷贝到 /usr/local/lib(建议自己生成的动态库文件放在此目录。默认动态库文件搜索路径是 /usr/lib, /lib, /usr/local/lib)

$ sudo cp libarithmetic.so.0.1 /usr/local/lib

4)创建一个软链接

$ sudo ln -sf libarithmetic.so.0.1 libarithmetic.so

使用动态库文件:

$ gcc use_arithmetic_lib.c -larithmetic -o use_arithmetic_lib

编译完成后,使用可执行文件时,不能脱离动态库环境(例如,可执行文件不能放到其它机器上跑), run 结果如下,

=====================================================================================

有时编译完成后,执行时报错: cannot open shared object file: No such file or directory 解决方法有以下两种:

第一种: 在 .bashrc 中添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib  (假定动态链接文件.so 安装在 /usr/local/lib 下)

第二种: $ sudo vim /etc/ld.so.conf  添加 /usr/local/lib 然后执行 $ sudo ldconfig

=====================================================================================

动态库文件的好处是,可以动态更新库文件,不用重复编译可执行文件。如下,

更改 arithmetic.c 为 arithmetic_modify.c 为,

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b + 100; }

编译生成目标文件:

$ gcc -c arithmetic_modify.c

生成动态库文件:

$ gcc -fPIC -shared -o libarithmetic.so.0.2 arithmetic.o

拷贝动态库文件到 /usr/local/lib

$ sudo cp libarithmetic.so.0.2 /usr/local/lib

更新软连接

$ sudo ln -sf libarithmetic.so.0.2 libarithmetic.so

再执行一下 use_arithmetic_lib,

最后,使用命令 ldd 可以查看可执行文件的动态库依赖关系,如下,

$ ldd use_arithmetic_lib

完。

转载于:https://www.cnblogs.com/gaowengang/p/6164461.html

Linux 创建静态库(.a)和动态库(.so)相关推荐

  1. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  2. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  3. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  4. Linux静态库.a与动态库.so的生成与区别、以及.so库文件的封装与使用

    #一.前言 如果有公司需要使用你们产品的一部分功能(通过代码调用这些功能),如果不想提供源代码,那么就可以通过封装成库文件的形式提供给对方使用.本文主要介绍了生成动态库与静态库文件的过程.以及封装和使 ...

  5. Linux下CMake简明教程(六)动态库和静态库的编译控制

    代码在git 有时只需要编译出动态库和静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake.首先按照如下重新组织文件,只留下testFunc.h和TestFunc.c ├── CM ...

  6. 【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序

    目录 找不到.so解决方法 方法一:添加环境变量 方法二:复制so文件到lib路径 方法三:(推荐)添加ldconfig寻找路径 方法四:在编译目标代码时指定该程序的动态库搜索路径 让程序在本目录找到 ...

  7. 库文件、静态库(lib)与动态库(dll)的生成与使用

    静态库 程序编译一般需经预处理.编译.汇编和链接几个步骤.在应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到 ...

  8. CMake教程(二)- 添加静态库文件和动态库文件

    CMake教程(二)- 添加静态库文件和动态库文件 什么是库文件 静态链接库 动态链接库 静态库和动态库的区别 如何在CMake中添加库文件 CMake 中 target_link_libraries ...

  9. 【转】matlab与C/C++混合编程——在Windows/Linux上调用Matlab编译的动态库文件

    转自:matlab与C/C++混合编程--在Windows/Linux上调用Matlab编译的动态库文件_sinat_18131557的博客-CSDN博客 date version comments ...

  10. Visual Studio引入外部库 ---- 弄懂静态库lib和动态库dll

    这两天由于想要研究一下socket的相关内容,但是没想到引入外部库还有这么多门道. 根据维基百科定义:一个现代编译器的主要工作流程如下:源代码(source code)→ 预处理器(preproces ...

最新文章

  1. 微型计算机硬件中访问速度最快的,习题一计算机基础知识.doc.doc
  2. Codeforces - 466C - Number of Ways - 组合数学
  3. R语言比较运算符和逻辑运算符
  4. 信息学奥赛一本通(1144:单词翻转)
  5. JavaScript---DOM元素
  6. const限定符用法汇总
  7. halcon学习之图像分割
  8. pythonopencv算法_OpenCV3-Python基于Kalman和CAMShift算法应用
  9. 首份《敏捷回顾年度报告》发布
  10. 灰色关联分析_(案例)相关分析之灰色关联度
  11. 路由器交换机[置顶] 路由器和交换机的综合实验⑵
  12. eplan步进电机_数控床子里电机用步进电机好还是伺服电机好?-工业支持中心-西门子中国...
  13. TP5.1.18+swoole实现聊天室
  14. js小游戏-别踩白块儿
  15. CTU Open Contest 2019 J. Beer Vision
  16. java改变图片颜色_使用java代码实现证件照换背景色
  17. 性格色彩测试android程序开发之六--activity界面
  18. Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)A蔡老板的会议
  19. HTML入门二(列表,表格与表单)
  20. 海外研发2nm,中国推进石墨烯芯片实现弯道超车,将再无需光刻机

热门文章

  1. 【渝粤题库】国家开放大学2021春2605经济法律基础题目
  2. Airbnb 面试题汇总
  3. C++中的左值和右值的区别
  4. 55)函数指针和其意义
  5. 原码、反码、补码、移码的换算关系
  6. Filter Session and Async 第三周博客
  7. 动态规划:最长上升子序列(二分算法 nlogn)
  8. 暗通道去雾算法的python实现
  9. Ubuntu 12.04装五笔,同时又可以打拼音。
  10. .NET中的数据结构——表