linux中的执行文件使用的一种叫做ELF格式来表示,这是一种特殊的二进制格式。ELF=Executable and Linkable Format, 可执行连接格式
Linux共享库的搜索路径先后顺序:
1、编译目标代码时指定的动态库搜索路径:在编译的时候指定-Wl,-rpath=路径
2、环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3、配置文件/etc/ld.so.conf中指定的动态库搜索路径
4、默认的动态库搜索路径/lib
5、默认的动态库搜索路径 /usr/lib
gcc -c a.c : 编译成目标文件
gcc -o a.c : 生成可执行文件
gcc a.c :生成执行文件a.exe
总结:只要参数有-c,总是生成目标文件;只要参数中无-c而只有-o, 则总是生成执行文件。
通常库分为:静态库,共享库,动态加载库。
一、静态库—— 一些目标文件的集合。以.a结尾。
1. 使用场合:程序链接时使用。链接器会将程序中使用到得函数代码从库文件中拷贝到应用程序中。
2. 如何创建?举个例子:创建libhello静态库文件。
首先创建 libhello.c
1#include<stdio.h>
2void hello()
3{
4printf("hello, welcome to library world!\n");
5}
创建头文件 libhello.h
1void hello();
生成静态库 libhello.a
# gcc -c libhello.c -o libhello.o
# ar rcs libhello.a libhello.o
/* PS:ar中的rcs的意思:r表明将模块加入静态库中,c表示创建静态库,s表示生产索引 */
使用静态库:
1#include<stdio.h>
2int main(void)
3{
4printf("use library hello.\n");
5hello();
6return0;
7}
# gcc -c test.c -o test.o
# gcc test.o -L. -lhello -o test
/* PS:-L.表示将当前目录加入到库搜索路径。默认的库搜索路径在/usr/lib目录下 */
/* PS:-I, 它表示搜索头文件的路径。这样gcc在查找头文件的时候会首先到-I指定的目录查找,然后才是系统默认目录 */
/* PS:-lname表示库搜索目录下的libname.a 或者libname.so文件 ,这也是为什么库文件都以lib开头的原因之一 */
/* PS:如果你的库文件不是libhello,而是hello. 那就不能用-l参数编译了, # gcc test.o -L. hello.a -o test */
/* PS:# gcc -L. -lhello test.o -o test 出错!!!-l是链接器选项,必须要放到被编译文件的后面 */
二、共享库:—— (以.SO结尾)在程序链接时做一些标记。在程序运行的时候,动态的加载所需模块。
因此,应用程序在运行的时候仍然需要共享库的支持。 共享库链接出来的文件比静态库要小得多。
一般,共享库有三个名字:linkr-name、soname、 real-name.