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!
", 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命令将优先使用动态库。

原文地址:https://www.cnblogs.com/shizqiang/p/5522636.html