1.什么是库
在windows平台和linux平台下都大量存在着库。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于windows和linux的本质不同,因此二者库的二进制是不兼容的。
本文仅限于介绍linux下的库。
2.库的种类
linux下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
静态库的后缀名为.a文件.当程序与一个静态库链接时,该程序用到的外部函数的机器码被从库中复制到最终生成的可执行文件中.
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小.
一个与共享库链接的可执行文件仅仅包含它用到的函数相关的一个表格,而不是那个函数的整个机器码.在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中.
3.库存在的意义
库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。
现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
4.例子源码:
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello (const char *name);
void bye(void);
#endif
hello.c
#include <stdio.h>
#include "hello.h“
void hello(const char *name){
printf("Hello,%s!/n",name);
}
bye.c
#include <stdio.h>
#include "hello.h“
void bye(void){
printf("Goodbye!/n");
}
main.c
#include <stdio.h>
int main(){
hello("everyone");
bye();
return 0;
}
然后编译生成hello.c 和 bye.c 的目标文件
gcc -c hello.c ==> hello.o
gcc -c bye.c ==> bye.o
然后生成静态库和动态库
ar cr libhello.a hello.o bye.o
ar是GNU的归档器,可以从对象生成静态库 cr 代表 "creat andd replace".如果库文件不存在则会创建.如果库文件已经存在,任何与它同名的原始文件将被命令上指定的新文件取代.
归档工具ar也提供了"内容列表"的选项"t"来列出已有库中的对象文件:
ar t libhello.a
hello.o
bye.o
创建动态库
gcc -g -Wall -shared hello.o bye.o -o libhello.so
然后链接生成最终的目标文件
gcc -g -Wall main.c -L. -lhello
在libhello.a和libhello.so同时存在时默认为动态链接,若想为静态链接加 -static 参数
gcc -g -Wall -static main.c -L. -lhello
若为动态需要改变环境变量
若不改变环境变量在编译时不会出现任何问题,但若运行时出错
./hello: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在 默认路径之前查找)
移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中。
当执行函数动态链接.so时,如果此文件不在缺省目录下‘/usr/local/lib’ and ‘/usr/lib’.
那么就需要指定环境变量LD_LIBRARY_PATH
若在当前目录下使用
export LD_LIBRARY_PATH=.
分享到:
相关推荐
C语言学习笔记C语言学习笔记C语言学习笔记C语言学习笔记
C语言学习笔记 C语言学习笔记 C语言学习笔记 C语言学习笔记
c语言学习笔记c语言学习笔记c语言学习笔记c语言学习笔记c语言学习笔记c语言学习笔记c语言学习笔记
C语言学习笔记.zip
认真学习的人从国内某个培训机构上课时,记录的C语言学习笔记,其中包含所有的C语言基本语法,文章中对指针、字符操作有好多介绍,整理的很全面,并且有图示哦!! 相信对大家学习C语言会有很大帮助!!!
c语言学习笔记
动态库的制作: 方法一: gcc -c -fPIC add.c sub.c div.c mul.c //-c表示生成.o目标文件,-f后加一些编译选项,PIC表示与位置无关 gcc -shared -o libmymath.so add.o sub.o mul.o div....
linux下C语言开发,从基础到网络通信笔记学习资料,如有想了解可以私聊
C语言学习笔记C语言学习笔记
C语言学习笔记.pdf
C语言基础部分学习笔记全部
c语言笔记c语言笔记c语言笔记c语言笔记
C语言学习笔记 必看知识点 精品啊 值得看
Linux下Gcc生成和使用静态库和动态库详解Linux下Gcc生成和使用静态库和动态库详解
C语言学习笔记,C语言学习笔记,qsort排序。。。。。。。。。。。。。。。。。。。。。。。。。。。。
《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》读书笔记《嵌入式Linux C语言应用程序设计》...
这是本人学习C语言的一些经验总结和学习笔记,想参考的可以看一下
一般用C语言操作配置文件是一个比较麻烦的事,但是为何不试一试这个库文件那?Linux C语言的配置文件操作库,非常不错!
linux C语言学习 linux c 基础 linux c 基础 linux c 基础 linux c 基础