.o/obj目标文件 .a/lib静态库 .so/dll动态库
我们通常把一些公用函数制作成函数库,供其它程序使用。
函数库分为静态库和动态库两种。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。(lib)(.a)
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。(dll)(.so)
–
.o 就是object, 也就相当于windows下编译的obj文件, 俗称目标文件. (obj)
.a 就是archive, 也就相当于windows的VC下编译的lib文件, 俗称静态库文件.(lib)
.so 是shared object,用于动态连接的,和windows的dll差不多,使用时才载入.(dll)
.o文件是链接文件,.a是静态库文件,靠.o文件生成,作为一个库为外部程序提供函数,接口。
.o 就相当于windows里的obj文件 ,一个.c或.cpp文件对应一个.o文件
.a 是好多个.o合在一起,用于静态连接 ,即STATIC mode,多个.a可以链接生成一个exe的可执行文件
.so 是shared object,用于动态连接的,和windows的dll差不多,使用时才载入。
具体的区别!!!!!!!!!!!!!!!!
通过案例说明!!!!!!!!!!!!!!!
1.hello.h
void hello(const char *name);
2.hello.c
#include"hello.h"
void hello(const char *name)
{
printf("Hello %s!/n", name);
}
3.main.c
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
静态库
gcc -c hello.c //得到hello.o,现在有hello.c hello.h hello.o main.c如下文件
ar cr libmyhello.a hello.o //由.o文件创建静态库,库的名字为libmyhello.a
//gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中
//main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello
gcc -o hello main.c -L. -lmyhello
./hello
Hello everyone!
rm libmyhello.a //删除静态库文件,程序照常运行,静态库中的公用函数已经连接到目标文件中了。
./hello //程序运行时将不再需要该静态库
Hello everyone!
动态库
gcc -shared -fPCI -o libmyhello.so hello.o
//同样由.o文件创建动态库
//动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so
//现在有hello.c hello.h hello.o libmyhello.so main.c如下文件
gcc -o hello main.c -L. -lmyhello
//使用动态库和使用静态库一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明。
//然后在用gcc命令生成目标文件时指明动态库名进行编译。
./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 everyone! //成功了。这也进一步说明了动态库在程序运行时是需要的。
//当静态库和动态库同名时, gcc命令将优先使用动态库。
转载:https://blog.csdn.net/kuanxu/article/details/7312146
转载:https://zhidao.baidu.com/question/1946953913764139388.html