Linux静态库使用 的使用其实跟 《msys2-gcc静态库使用》是差不多的。
本文来讲Linux的so动态库,码如下:
注意不要在 msys2 环境操作,msys2 没有 so动态库。
又或者,如果 myMath 是一个动态库,又二级嵌套引用又会怎样,带着这些疑问,咱们开始研究,代码如下:
myTest.h :
int my_test(int a, int b);
myTest.c :
#include "myTest.h"
int my_test(int a, int b) {
return a + b;
}
myMath.h :
int add(int a, int b);
myMath.c:
#include "myMath.h"
#include "myTest.h"
int add(int a, int b) {
return my_test(a,b);
}
main.c :
#include <stdio.h>
#include "myMath.h"
int main()
{
int a = 3, b = 5;
printf("a+b=%d\n", add(3, 5));
return 0;
}
代码已经写好,先执行一下命令编译出 .o 后缀的文件。
gcc -c myMath.c -o myMath.o
gcc -c myTest.c -o myTest.o
gcc -c main.c -o main.o
- -fPIC:也可以写成 -fpic,功能是令 GCC 编译器生成动态链接库时,用相对地址表示库中各个函数和变量的存储位置。这样做的好处是,无论动态链接库被加载到内存的什么位置,都可以被多个程序(进程)同时调用;
要编译 libmyMath.so 动态库 ,常规的做法是 gcc -c -fPIC myMath.c -o myMath.o
,把 C 代码编译成 object 文件,然后用 gcc -shared myMath.o -o libmyMath.so
把 object 文件转成 .so 动态库文件。但我们现在有一个嵌套库 myTest ,而且不想暴露给别人,这时候应该如何编译。
其实跟静态库的编译差不多,把 myTest.o 文件加进去就行,gcc -shared myTest.o myMath.o -o libmyMath.so
。我们可以用以下两个不同的命令看一下生成的 libmyMath.so 有什么区别。
第一个命令:gcc -shared myMath.o -o libmymath_1.so
第二个命令:gcc -shared myMath.o myTest.o -o libmymath_2.so
第一个命令是没加 myTest.o 的。
比对 libmymath-1.so 跟 myMath.o 并没有发现什么相同的地方。跳过不管。如下图:
此时, myTest.o 跟 myMath.o 已经没用了,可以删除,只需要把 .so 给别人用就行,可以执行以下命令生成 main 可执行文件。
#第一种方式
gcc main.o libmymath_2.so -o main
#第二种方式
gcc main.o -o main -lmymath_2 -L.
提示找不到 so 文件,把so 赋值到标准库目录即可。
相关阅读:
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。