以前一直不理解Linux 下编译产生的各种文件是什么意思,今天花了一点时间来理一理:

首先介绍静态链接库(lib)和动态链接库(dll)的区别:

静态链接库就是把(lib)文件中用到的函数直接连接到目标代码中,程序运行时不需要改静态库;动态库在编译时不会被连接到目标代码中,在程序运行时会动态的调用这个dll库

1、以下面的源程序为例--hello.c、hello.h和main.c:

程序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);
}

程序3:main.c

#include "hello.h"

int main()
{
hello("everyone");
return 0;
}

2、将hello.c编译成.o文件 

无论静态库,还是动态库,都是由.o文件创建的

gcc -c hello.c

会生成hello.o目标文件

3、由.o文件创建静态库

静态库文件名是以lib为前缀,扩展为,a.创建静态库时用ar命令

ar -cv libhello.a hello.o

4、在程序库中使用静态库

在用gcc命令生成目标是知名静态库名,gcc会从静态库中将公用函数链接到目标文件中。在刚刚的main.c中包含了静态库的头文件hello.h ,还包括了公用函数hello,在编译时需要加上静态库

gcc main.c libhello.a -o hello

至今运行会得到

./hello

 

Hello everyone!

再看如何创建动态库文件

动态库前缀同样是lib,不过后缀名为.so 动态库创建如下:

gcc -shared -fPCI -o libhello.so hello

在程序中使用动态库:

gcc -o main.c -L -lhello