关于Linux静态库和动态库的分析
关于Linux静态库和动态库的分析
|
1.什么是库 2.库的种类 二者的不同点在于代码被加载的时刻不同。 3.库存在的意义 4.库文件是怎样产生的在linux下 5.库文件是怎样命名的,有没有什么规范 6.怎样知道一个可运行程序依赖哪些库 7.可运行程序在运行的时候怎样定位共享库文件 8.在新安装一个库之后怎样让系统可以找到他 我们通常把一些公用函数制作成函数库,供其他程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序执行时将不再须要该静态库。动态库在程序编译时并不会被连接到目标代码中。而是在程序执行是才被加载,因此在程序执行时还须要动态库存在。 本文主要通过举例来说明在Linux 步:编辑得到举例的程序--hello.h、hello.c和main.c; hello.h(见程序1)为该函数库的头文件。 hello.c(见程序2)是函数库的源程序。当中包括公用函数hello。该函数将在屏幕上输出"Hello main.c(见程序3)为測试库文件的主程序,在主程序中调用了公用函数hello。 程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name); #endif //HELLO_H 程序2: hello.c #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } #include "hello.h" int main() { hello("everyone"); return 0; } 步:将hello.c编译成.o文件; 不管静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。 在系统提示符下键入下面命令得到hello.o文件。 # gcc -c hello.c 我们执行ls命令看看是否生存了hello.o文件。 # ls hello.c hello.h hello.o main.c 在ls命令结果中,我们看到了hello.o文件。本步操作完毕。 以下我们先来看看怎样创建静态库,以及使用它。 步:由.o文件创建静态库。 静态库文件名称的命名规范是以lib为前缀。紧接着跟静态库名。扩展名为.a。比如:我们将创建的静态库名为myhello,则静态库文件名称就是libmyhello.a。 在创建和使用静态库时,须要注意这点。创建静态库用ar命令。 在系统提示符下键入下面命令将创建静态库文件libmyhello.a。 # ar cr libmyhello.a hello.o 我们相同执行ls命令查看结果:# ls ls命令结果中有libmyhello.a。 hello.c hello.h hello.o libmyhello.a main.c 步:在程序中使用静态库。 静态库制作完了,怎样使用它内部的函数呢?仅仅须要在使用到这些公用函数的源程序中包括这些公用函数的原型声明。然后在用gcc命令生成目标文件时指明静态库名。gcc将会从静态库中将公用函数连接到目标文件里。 注意。gcc会在静态库名前加上前缀lib。然后追加扩展名.a得到的静态库文件名称来查找静态库文件。 在程序3:main.c中。我们包括了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。以下先生成目标程序hello。然后执行hello程序看看结果怎样。 # gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone! 我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。 # rm libmyhello.a rm: remove regular file `libmyhello.a'? y # ./hello Hello everyone! 程序照常执行,静态库中的公用函数已经连接到目标文件里了。 我们继续看看怎样在Linux中创建动态库。 我们还是从.o文件開始。 步:由.o文件创建动态库文件。 动态库文件名称命名规范和静态库文件名称命名规范类似。也是在动态库名添加前缀lib,但其文件扩展名为.so。 比如:我们将创建的动态库名为myhello,则动态库文件名称就是libmyhello.so。 用gcc来创建动态库。 在系统提示符下键入下面命令得到动态库文件libmyhello.so。 # gcc -shared -fPIC -o libmyhello.so hello.o 我们照样使用ls命令看看动态库文件是否生成。# ls hello.c hello.h hello.o libmyhello.so main.c 步:在程序中使用动态库; 在程序中使用动态库和使用静态库全然一样,也是在使用到这些公用函数的源程序中包括这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先执行gcc命令生成目标文件,再执行它看看结果。 # gcc -o hello main.c -L. –lmyhello $gcc–o app main.c /home/test/program/ibmyLib.so $gcc -o app2 main.c $PWD/libmyhelloso.so # ./hello ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory # 哦!出错了。快看看错误提示。原来是找不到动态库文件libmyhello.so。 程序在执行时,会在/usr/lib和/lib等文件夹中查找须要的动态库文件。若找到,则加载动态库。否则将提示类似上述错误而终止程序执行。我们将文件libmyhello.so拷贝到文件夹/usr/lib中,再试试。 # mv libmyhello.so /usr/lib # ./hello ./hello: error while loading shared libraries: /usr/lib/libhello.so: cannot restore segment prot after reloc: Permission denied # chcon -t texrel_shlib_t /usr/lib/libhello.so # ./hello Hello everyone! # 成功了。这也进一步说明了动态库在程序执行时是须要的。 |
关于Linux静态库和动态库的分析的更多相关文章
- Linux下Gcc生成和使用静态库和动态库详解(转)
一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- Linux下Gcc生成和使用静态库和动态库详解
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- Linux 静态库和动态库 使用说明
Linux下程序运行中,有两种库,静态库和动态库. 静态库:名字一般为libxxx.a,编译时会整合到可执行程序中,优点是运行时不需要外部函数库支持,缺点是编译后程序较大,一旦静态库改 ...
- 在Linux中创建静态库和动态库
我们通常把一些公用函数制作成函数库,供其它程序使用. 函数库分为静态库和动态库两种. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库. 动态库在程序编译时并不会被连接到目标代码中 ...
- 详细讲解 关于Linux静态库和动态库的分析
基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...
- linux下的共享库(动态库)和静态库
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- Linux学习笔记7——linux中的静态库和动态库
一.静态库的编译 静态库的编译过程如下: 1.编译成目标文件 这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c 2.归档成静态库 A.归档的工具是ar工具,使用a ...
随机推荐
- codevs2596 售货员的难题(状压dp)
2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15 ...
- [Apple开发者帐户帮助]三、创建证书(7)创建证书签名请求
Mac上的Keychain Access允许您创建证书签名请求(CSR). 启动位于的Keychain Access /Applications/Utilities. 选择Keychain Acces ...
- D - Replacement
Problem description Little Petya very much likes arrays consisting of n integers, where each of them ...
- 基于bootstarp的Dailog
oaoDailog开发帮助 1. 帮助文档关键字 boostrap模态框oaoDailog 2. 使用场景 当网页上点击某个按钮需要给予用户提示确认,用户点击确认按钮才 ...
- bootstrap的栅格系统和响应式工具
关于bootstrap的响应式布局,昨天看了杨老师的视频教学https://www.bilibili.com/video/av18357039豁然开朗,在这里记录一下 一:meta标签的引用 < ...
- 时序分析:串匹配—Brute-Force算法
在使用KMP算法之前,使用了BF算法用于串匹配:原文链接已无法查找..... 设有主串s和子串t,子串t的定位就是要在主串s中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t ...
- 07--c++类的构造函数详解
c++类的构造函数详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特 ...
- atcoder.keyence2019.contest E-Connecting Cities
真是道好题啊,当时怎么想都没想出来... 传送门 简述题意: 有n个点,每个点有一个权值Ai,连接i,j两个点的代价是 |i−j|×D+Ai+Aj 其中D是给定的常数,问把n个点联通的最小代价 1≤ ...
- TensorFlow技术解析与实战学习笔记(15)-----MNIST识别(LSTM)
一.任务:采用基本的LSTM识别MNIST图片,将其分类成10个数字. 为了使用RNN来分类图片,将每张图片的行看成一个像素序列,因为MNIST图片的大小是28*28像素,所以我们把每一个图像样本看成 ...
- Lua循环结构while循环、repeat 循环、for循环_学习笔记03
Lua循环结构while循环.repeat 循环.for循环 while语法结构 while 循环条件 do 循环体 end --1.输出1到100 index = do print(index) ...