Linux 动态库 静态库
什么是库
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和Linux的本质不同,因此二者库的二进制是不兼容的。Linux操作系统支持的库函数分为静态库和动态库,动态库又称共享库。Linux系统有几个重要的目录存放相应的库函数,如/lib,/usr/lib;头文件放在/usr/include。
什么是静态库
静态库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库的支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如何静态函数库改变了,那么你的程序必须重新编译,而且体积也比较大。
什么是动态库
动态库的名字一般是libxxx.so,相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数,因此动态库函数所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。
静态库的制作:
gcc -c file1.c
gcc -c file2.c
......
gcc -c fileN.c
ar -rcs libname.a file1.o file2.o ...... fileN.o
动态库制作:
gcc -shared -fpic -o libname.so file1.c file2.c ...... fileN.c
编译:
动态库编译:gcc main.c -o test_li -Llib_patch -lname
静态库编译:gcc -static main.c -o test_li -Llib_patch -lname
(注:编译时出现提示错误:/usr/lib/ld:cannot find lc等错误查看链接:http://www.cnblogs.com/xiaohexiansheng/p/5500870.html)
案例:
crypto.c
#include <stdio.h> void crypto(void)
{
printf("Start crypt..."); return ;
} crypto.h
#ifndef _CRYPTO_H_
#define _CRYPTO_H_ void crypto(void); #endif func.c
#include <stdio.h> void func(void)
{
printf("Start func..."); return ;
} func.h
#ifndef _FUNC_H_
#define _FUNC_H_ void func(void); #endif
生成静态库:
[xiaohexiansheng@centos6 test]$ ls
crypto.c crypto.h func.c func.h main.c
[xiaohexiansheng@centos6 test]$ gcc -c crypto.c -o crypto.o
[xiaohexiansheng@centos6 test]$ gcc -c func.c -o func.o
[xiaohexiansheng@centos6 test]$ ar -crs libcrypfunc.a crypto.o func.o
[xiaohexiansheng@centos6 test]$ ls
crypto.c crypto.h crypto.o func.c func.h func.o libcrypfunc.a main.c
生成动态库:
[xiaohexiansheng@centos6 test]$ gcc -shared -fpic -o libcrypfunc.so crypto.c func.c
[xiaohexiansheng@centos6 test]$ ls
crypto.c crypto.h crypto.o func.c func.h func.o libcrypfunc.a libcrypfunc.so main.c
使用生成的动态库:
[xiaohexiansheng@centos6 test]$ gcc main.c -L. -lcrypfunc -o app
(注:-L指定函数库查找的位置,-L后面还有一个‘.’,表示在当前目录下寻找 -l指定库函数名,其中的lib和.a(.so)省略)
[xiaohexiansheng@centos6 test]$ ls
app crypto.c crypto.h crypto.o func.c func.h func.o libcrypfunc.a libcrypfunc.so main.c
[xiaohexiansheng@centos6 test]$ ./app
./app: error while loading shared libraries: libcrypfunc.so: cannot open shared object file: No such file or directory
[xiaohexiansheng@centos6 test]$ pwd
/home/xiaohexiansheng/cc/library/test
[xiaohexiansheng@centos6 test]$ export LD_LIBRARY_PATH='/home/xiaohexiansheng/cc/library/test'
[xiaohexiansheng@centos6 test]$ ./app
Start crypt...Start func...[xiaohexiansheng@centos6 test]$
使用生成的静态库:
[xiaohexiansheng@centos6 test]$ ls
app crypto.c crypto.h crypto.o func.c func.h func.o libcrypfunc.a libcrypfunc.so main.c
[xiaohexiansheng@centos6 test]$ gcc -static main.c -L. -lcrypfunc -o app
[xiaohexiansheng@centos6 test]$ ls
app crypto.c crypto.h crypto.o func.c func.h func.o libcrypfunc.a libcrypfunc.so main.c
[xiaohexiansheng@centos6 test]$ ./app
Start crypt...Start func...[xiaohexiansheng@centos6 test]$
让我们看下静态库跟动态库的大小的区别:
[xiaohexiansheng@centos6 test]$ gcc main.c -L. -lcrypfunc -o sharedapp
[xiaohexiansheng@centos6 test]$ gcc -static main.c -L. -lcrypfunc -o staticapp
[xiaohexiansheng@centos6 test]$ du -sh sharedapp staticapp
8.0K sharedapp
632K staticapp
注意:
当静态库和动态库同时存在时,gcc默认使用的是动态库。如果强制使用静态库则加上-static选项。
动态库生成的可执行文件app不能正常运行是因为系统默认在/lib、/usr/lib下寻找动态库,如果想要程序正常运行可以把动态库放到这两个目录下的任意一个,或者按上面的那种方法 ---> LD_LIBRARY_PATH: 告诉系统执行程序的时候,除了/lib, /usr/lib以外还到哪里找动态库。
链接静态库的可执行文件比动态库的可执行文件要大很多。
参考链接:http://blog.chinaunix.net/uid-26833883-id-3219335.html
Linux 动态库 静态库的更多相关文章
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
- 在Linux中创建静态库.a和动态库.so
转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- Linux库函数制作(静态库、动态库)
Linux库函数制作(静态库.动态库) 静态库与动态库 链接方式 链接分为两种:静态链接.动态链接 静态链接: 由链接器在链接时将库的内容加入到可执行程序中 静态链接的特点是: 优点: 对运行环境的依 ...
- linux+vs2013编译静态库和动态库
Linux下创建与使用静态库 Linux静态库命名规则 Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为 ...
- linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...
- linux下的静态库和动态库
一.linux下的静态库 静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在! 二.linux下动态库的构建和使用 1.动态库的构建 ...
- linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库
linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库 创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a 查 ...
- Linux中的静态库与动态库
什么是库文件? 库文件是事先编译好的方法的合集.比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,不需要重新编写. Linux系统中: 1.静态库的扩展名为.a:2. ...
随机推荐
- Oracle基础 09 概要文件 profile
--创建 profile 概要文件create profile profile123 limit failed_login_attempts 2; --修改用户的 profile 文件alter u ...
- Selenium2+python自动化74-jquery定位【转载】
转至博客:上海-悠悠 前言 元素定位可以说是学自动化的小伙伴遇到的一道门槛,学会了定位也就打通了任督二脉,前面分享过selenium的18般武艺,再加上五种js的定位大法. 这些还不够的话,今天再分享 ...
- docker从零开始 存储(六)存储驱动如何选择
Docker存储驱动程序 理想情况下,将非常少的数据写入容器的可写层,并使用Docker卷来写入数据.但是,某些工作负载要求您能够写入容器的可写层.这是存储驱动程序的用武之地. Docker使用可插拔 ...
- python的上下文管理(contextlib)(2)
contextlib是一个Python模块,作用是提供更易用的上下文管理器. 编写 __enter__ 和 __exit__ 仍然很繁琐,因此Python的标准库 contextlib 提供了更简单的 ...
- Nodejs获取Azure Active Directory AccessToken
因为现有的代码已经迁入至Azure中,并且受AD保护,所以在获取数据时,需要传入Token后才可以获取到数据,那么第一步肯定是需要先提取到token var adal = require('adal- ...
- 【转-记】mysql总结
1 | 查询所有数据 select * from Info 查所有数据 select Code,Name from Info 查特定列 2 | 根据条件查 select * from Inf ...
- 洛谷 P1570 KC喝咖啡【二分答案/最大化平均值模板】
题目描述 话说KC和SH在福州的时候常常跑去85°C喝咖啡或者其他的一些什么东西. 这天,KC想要喝一杯咖啡,服务员告诉他,现在有n种调料,这杯咖啡只可以加入其中的m种(当然KC一定会加入m种,不会加 ...
- CF 862A Mahmoud and Ehab and the MEX【数组操作】
A. Mahmoud and Ehab and the MEX time limit per test 2 seconds memory limit per test 256 megabytes in ...
- 《Machine Learning》(第一章)序章
关键词:机器学习,基本术语,假设空间,归纳偏好,机器学习用途 一.机器学习概述 机器学习是一门从数据中,经过计算得到模型(Model)的一种过程,得到的模型不仅能反应出训练数据集中所蕴含的规律,并且能 ...
- 树链剖分【p4114】Qtree-Query on a tree I
Description 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0 Input 第 ...