Linux动态库使用 - 弦外之音

/ 0评 / 0

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

要编译 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 赋值到标准库目录即可。

相关阅读:

  1. 《Linux c++ 嵌套依赖动态库制作踩坑》

由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。

发表回复

您的电子邮箱地址不会被公开。