Linux下动态库和静态库的生成和使用
1.准备头文件和源文件
hello.h
#ifndef HELLO_H #define HELLO_H void hello(const char *name): #endif
hello.c
#include <stdio.h> void hello(const char *name) { printf("Hello, %s!\n", name); }
main.c
#include "hello.h" int main(int argc, char * argv[]) { hello("C Programmer"); return 0; }
2.了解动态库和静态库的区别
①静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
②动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
3.静态库的生成步骤
①编译hello.c生成目标文件,注意此时要加入参数-fPIC;
gcc -c -fPIC hello.c
执行此命令后会生成hello.o的目标文件。
②根据上面的hello.o文件生成动态库文件;
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。
gcc -shared -fPIC -o libmyhello.so hello.o
执行此命令后会生成libmyhello.so的动态库文件。
③使用动态库;
gcc -o hello main.c -L. -lmyhello // 和静态库一样
此时运行hello会报错,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态 库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。结果成功了!这也进一步说明了动态库在程序运行时是需要的。
4.动态库的生成步骤
①编译hello.c生成目标文件;
gcc -c hello.c
执行此命令后会生成hello.o的目标文件。
②根据上面的hello.o文件生成静态库文件;
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。
ar cr libmyhello.a hello.o
执行此命令后会生成libmyhello.a的静态库文件。
③使用静态库;
gcc -o hello main.c -L. -lmyhello
上面如果不指定静态库的话,由于main.c中引入了hello.h,编译则会报错。
执行上面的命令,生成的hello可执行文件便可以运行了,libmyhello.a文件删除后也不会影响hello的运行。
5.PS
当静态库和动态库同名时, gcc命令将优先使用动态库。