c/c++ 动态库与静态库的制作和使用
静态库的用法
静态库的文件名 libxxx.a -->对应windows的.lib文件
做静态库的命令:
ar rcs libxxx.a file1.o file2.o file.o
使用静态库:
gcc main.c -L lib/ -lxxx
注意:-L的作用是告诉gcc你的libxxx.a放在了哪个目录里;-l的作用是告诉gcc使用哪个静态库。
举个例子,目录结果如下:
├── include
│ └── head.h
├── lib
│
├── main.c
└── src
├── add.c
├── mul.c
└── sub.c
head.h
int add(int, int);
int sub(int, int);
int mul(int, int);
add.c
int add(int a, int b){
return a + b;
}
sub.c
int sub(int a, int b){
return a - b;
}
mul.c
int mul(int a, int b){
return a * b;
}
- 步骤1:在src目录执行下面的命令,生产.o文件
gcc -c *.c
执行后,在src目录下生产了add.o,sub.o,mul.o三个文件
- 步骤2:在src目录执行下面的命令,生产libCalc.a文件
ar rcs libCalc.a *.o
执行后,在src目录下生产了libCalc.a
- 步骤3:在src目录执行下面的命令,把libCalc.a移动到上层的lib文件夹
mv libCalc.a ../lib/
执行后,在lib文件夹出现了libCalc.a
main.c
#include <stdio.h>
#include "head.h"
int main(){
int a = 10, b = 5;
printf("add:%d\n",add(a, b));
printf("sub:%d\n",sub(a, b));
printf("mul:%d\n",mul(a, b));
}
- 步骤4:在src的上层目录,执行下面命令生产a.out文件
gcc main.c -I include/ -L lib/ -lCalc
-I:指定头文件所在的路径
-L:指定静态库文件所在的路径
-l:指定使用哪个静态库
最后目录结构如下:
├── a.out
├── include
│ └── head.h
├── lib
│ └── libCalc.a
├── main.c
└── src
├── add.c
├── add.o
├── mul.c
├── mul.o
├── sub.c
└── sub.o
动态库的用法
动态库的文件名 libxxx.so -->对应windows的.dll文件
编译时,需要加【-fPIC】选项。
它的作用是,编译出与位置无关的代码。因为动态库在加载到下图的共享库区的时候,不一定加载到哪个位置,
所以加了-fPIC后,就记录了每个函数相对于这个动态库头地址的偏移,加载后动态库在内存里的头地址是知道的,又知道了每个函数相对于头的偏移量,自然而然地就能够找到每个函数在内存里的位置了。

做静态库的命令(-shared):
gcc -shared -o libCalc.so *.o
用【ldd】命令查看编译出来的可执行文件文件
ldd a.out
结果如下:
ys@ys-VirtualBox:~/lianxi1$ ldd a.out
linux-vdso.so.1 (0x00007ffdebd2d000)
libCalc.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3b3e7ee000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3b3ede1000)
发现【libCalc.so => not found】
解决办法1:把做好的动态库libCalc.so拷贝到【/lib】或者【/usr/lib】下,也可以用ln做软硬连接:把当前目录下的lib目录下的libCalc.so链接到/lib下
sudo ln -s ./lib/libCalc.so /lib/
结果如下:

发现软连接是红色的,也就是不能使用的意思,错误在于./lib/libCalc.so这个路径是不存在的,原因在于上面的命令使用的是相对路径,改成绝对路径就OK了,命令如下:
sudo ln -s ~/lianxi1/lib/libCalc.so /lib/
结果如下:

发现软连接是绿色的了,说明库可以使用了,开森啊。
再用【ldd】命令查看编译出来的可执行文件文件
ldd a.out
结果如下:
ys@ys-VirtualBox:~/lianxi1$ ldd a.out
linux-vdso.so.1 (0x00007ffe783c4000)
libCalc.so => /lib/libCalc.so (0x00007f35fd6ae000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f35fd2bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f35fdab2000)
发现【libCalc.so】已经被找到了,好开心。
但是这种方法不推荐使用。理由是,放在了系统的动态库目录里,容易和别的库重复,发生冲突。
解决办法2:告诉系统,给我加一个动态库的路径,这个是最好的办法。
- 首先编辑/etc/ld.so.conf文件,添加你自己的库的路径
- 然后,执行:【sudo ldconfig】,就OK了。
静态库和动态库的特点:
- 静态库:
- 编译的时候,直接把静态库的代码直接编译到目标文件
- 执行速度快,不需要在执行的时候加载动态库
- 库文件修改后,必须重新编译使用库的代码
- 动态库
- 编译的时候,不把静态库的代码直接编译到目标文件
- 执行速度慢,在执行的时候需要加载动态库
- 库文件修改后,一般不需要重新编译使用库的代码,只有在库的接口改变时,才需要重新编译使用库的代码。
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 动态库与静态库的制作和使用的更多相关文章
- 【转】iOS动态库和静态库的简要介绍
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
- libjpeg 交叉编译动态库和静态库
1.下载libjpeg库,解压之 得到了jpeg6b和libtool-2.2.4两个文件夹. 2.编译安装libtool工具. 这是配置libtool,这里需要注意:configure 参 ...
- VS2008 动态库和静态库的生成和加载
第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\V ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- Linux系统中“动态库”和“静态库”那点事儿
摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...
- linux --> 动态库和静态库
库的分类 根据链接时期的不同,库分为静态库和动态库之分. 静态库:在链接阶段被链接的,生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 动态库:在程序执行的时候被链接的,即使程 ...
随机推荐
- Qtp自动测试工具
QTP是基于GUI界面的自动化测试工具,用于系统的功能测试. QTP录制的是鼠标和键盘的消息.QTP录制回放时基于windows操作系统的消息机制.QTP在录制时监听应用程序的消息,监听到之后把消息放 ...
- C语言检查ip是否合法
在工作当中我们经常会遇到这种问题:判断一个输入的字符串是否为合法的IP地址,下面是一个测试小程序: #include <stdio.h> #include <string.h> ...
- 对于Javascript 执行上下文的理解
转载无源头地址 在这篇文章中,将比较深入地阐述下执行上下文 – JavaScript中最基础也是最重要的一个概念.相信读完这篇文章后,你就会明白javascript引擎内部在执行代码以前到底做了些什么 ...
- Web前端原生JavaScript浅谈轮播图
1.一直来说轮播图都是困扰刚进业内小白的一大难点,因为我们不仅需要自己作出一个比较完美的运动框架(虽然网上一抓一大把,但是哪有比自己做出来实现的有成就感,不是吗?^_^),还必须需要非常关键性的把握住 ...
- JavaScript设计模式Item 1—多态
多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果.换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈. 从字面上来理解多态不太容易, ...
- javascript系列1--把字符串当代码来执行
转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html 请尊重笔者的劳动成果 --John Hou 在javascript中有多种方法可以 ...
- SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。
本文是在学习https://blog.csdn.net/housisong/article/details/1452249一文的基础上对算法的理解和重新整理,再次非常感谢原文作者的深入分析以及分享. ...
- Elasticsearch笔记九之优化
Elasticsearch笔记九之优化 ).get(); } curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行. 2:内存设置之前介绍过es集群有 ...
- ConcurrentHashMap简介
ConcurrentHashMap为了高并发而设计,相比于HashTable和HashMap有更多优势.HashTable是同步的,在多线程环境下,能保证程序执行的正确性,每次同步执行的时候都要锁住整 ...
- 51nod 1135 原根 就是原根...
%%% dalao Orz ,筛素数到sqrt(n),分解ϕ(p),依次枚举判断就好了 #include<cstdio> #include<cstring> #include& ...