linux下gcc编译生成.out,.o,.a,.so文件 | 花开就一次成熟我却错过
Cobb 551 1

共享库和静态库可以看一下

4、a静态库生成 (1)创建静态库 由.o文件创建静态库,静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。

例如:我们将创建的静态库名为hello,则静态库文件名就是libhello.a。

生成.a文件:

ar -cr libhello.a hello.o

结果:

(2)调用静态库 main.cpp

#include <stdio.h> void hello(); int main() { hello(); return 0; } 编译main.cpp,静态链接libhello.a:

gcc main.cpp libhello.a -o main.out

5、so共享库生成 (1)创建so 由.o文件创建动态库文件,动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其

文件扩展名为.so。

例如:我们将创建的动态库名为hello,则动态库文件名就是libhello.so。

生成so文件:

gcc -shared -fPIC -o libhello.so hello.o

我们执行,发现报错了:

这是因为在生成hello.o时,没有使用-fPIC选项,所以我们使用

gcc -c -fPIC hello.cpp

重新生成一下hello.o,再次执行生成so命令。

(2)调用so 编译main.cpp:

gcc -o main.out main.cpp -L. -lhello

执行,我们发现报错了:

我们发现报错了,原来是找不到动态库文件libhello.so,程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。

若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。

我们将文件libhello.so移动到目录/usr/lib中,再运行main.out,已经可以正常调用so了。

评论区