84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
谁能简单明白易懂说明一下
.a
.o
.so
这几種文件到底啥区别 与 联系
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
1、是静态库类似NT下的lib2、是对象文件。就是编译成程序时的半成品。3、是动态库类似NT下的DLL
在Linux上创建静态库.a和动态库.so
我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和共享库两种:1.静态函数库这类库的名字一般是libxxx.a.利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中.优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为缺点,如果静态函数库改变了,那么你的程序必须重新编译.比如PHP的configure参数--enable-mbstring=static(默认),生成的mbstring.a被静态链接到二进制程序php,php-fpm,php-cgi,libphp.so中.2.共享函数库这类库的名字一般是libxxx.so.相对于静态函数库,共享函数库在编译的时候 并没有被编译进目标代码中.当程序执行到相关函数时才调用共享函数库里相应的函数,因此共享函数库所产生的可执行文件比较小.由于共享函数库没有被整合进你的程序,而是在程序运行时动态地申请并调用,所以程序的运行环境中必须提供相应的库.共享函数库的改变并不影响你的程序,所以共享函数库的升级比较方便.比如PHP的configure参数--enable-mbstring=shared,生成的mbstring.so就是共享库.另外用phpize生成PECL扩展库的configure文件,然后make编译,生成的也是共享库.
--enable-static 生成静态库a文件--enable-shared 生成共享库so文件
用ar打包.o文件(obj对象文件,目标文件)生成.a共享库:ar -r libname.a name.oar -t libname.a 可见 name.o
简单的来说一下
.o文件是源码编译出的二进制文件。你先得了解从源代码到可执行文件的过程。以一个简单的add函数源文件为例。
add
int add(int a,int b) { return a+b; }
先预处理为.i文件gcc -E add.c -o add.i再编译为汇编文件gcc -S add.i -o add.s再汇编为二进制的.o文件gcc -c add.s -o add.o
.i
gcc -E add.c -o add.i
gcc -S add.i -o add.s
gcc -c add.s -o add.o
好,现在.o文件出来了。它就是C/C++编译的产物,因为C/C++编译的单元编译。每一个.c/.cpp文件就是一个编译单元,把所有单元都编译好之后,再连接成一个完成的程序。
.a文件实质上就是.o文件打了个包。一般把它叫做静态库文件。它在使用的时候,效果和使用.o文件是一样的。
.so文件就不一样了,它不是简单的.o文件打了一个包,它是一个ELF格式的文件,也就是linux的可执行文件。.so文件可以用于多个进程的共享使用(位置无关的才行),所以又叫共享库文件。程序在使用它的时候,会在运行时把它映射到自己进程空间的某一处,其不在使用它的程序中。
.o 是一个最小的编译单元 .a 就是一组 .o文件打包了.so 除了没有 main 函数,和一个可执行程类似了。
1、是静态库类似NT下的lib
2、是对象文件。就是编译成程序时的半成品。
3、是动态库类似NT下的DLL
在Linux上创建静态库.a和动态库.so
我们通常把一些公用函数制作成函数库,供其它程序使用.
函数库分为静态库和共享库两种:
1.静态函数库
这类库的名字一般是libxxx.a.
利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中.
优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.
当然这也会成为缺点,如果静态函数库改变了,那么你的程序必须重新编译.
比如PHP的configure参数--enable-mbstring=static(默认),
生成的mbstring.a被静态链接到二进制程序php,php-fpm,php-cgi,libphp.so中.
2.共享函数库
这类库的名字一般是libxxx.so.
相对于静态函数库,共享函数库在编译的时候 并没有被编译进目标代码中.
当程序执行到相关函数时才调用共享函数库里相应的函数,因此共享函数库所产生的可执行文件比较小.
由于共享函数库没有被整合进你的程序,而是在程序运行时动态地申请并调用,所以程序的运行环境中必须提供相应的库.
共享函数库的改变并不影响你的程序,所以共享函数库的升级比较方便.
比如PHP的configure参数--enable-mbstring=shared,生成的mbstring.so就是共享库.
另外用phpize生成PECL扩展库的configure文件,然后make编译,生成的也是共享库.
--enable-static 生成静态库a文件
--enable-shared 生成共享库so文件
用ar打包.o文件(obj对象文件,目标文件)生成.a共享库:
ar -r libname.a name.o
ar -t libname.a 可见 name.o
简单的来说一下
.o文件
.o
文件是源码编译出的二进制文件。你先得了解从源代码到可执行文件的过程。以一个简单的
add
函数源文件为例。先预处理为
.i
文件gcc -E add.c -o add.i
再编译为汇编文件
gcc -S add.i -o add.s
再汇编为二进制的.o文件
gcc -c add.s -o add.o
好,现在
.o
文件出来了。它就是C/C++编译的产物,因为C/C++编译的单元编译。每一个.c/.cpp文件就是一个编译单元,把所有单元都编译好之后,再连接成一个完成的程序。.a文件
.a
文件实质上就是.o
文件打了个包。一般把它叫做静态库文件。它在使用的时候,效果和使用.o
文件是一样的。.so文件
.so
文件就不一样了,它不是简单的.o
文件打了一个包,它是一个ELF格式的文件,也就是linux的可执行文件。.so
文件可以用于多个进程的共享使用(位置无关的才行),所以又叫共享库文件。程序在使用它的时候,会在运行时把它映射到自己进程空间的某一处,其不在使用它的程序中。.o 是一个最小的编译单元
.a 就是一组 .o文件打包了
.so 除了没有 main 函数,和一个可执行程类似了。