以前一直不理解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
转载于:http://www.cppblog.com/wc250en007/archive/2012/11/03/194186.html
来源:https://www.cnblogs.com/emilyhome/p/7423871.html