当前位置: 首页>后端>正文

NDK 打包静态库和动态库(一)

先看下编译过程:
1.预处理:文件引入,宏替换
2.编译:将预处理后的文件编译成汇编代码。
3.汇编:把编译阶段产生".s"文件转化成二机制目标代码,也就是机器代码。
4.链接:将多个目标文件和所需要的库文件链接生成可执行文件的过程。

现有如下代码:
test.h

#define PI 3.14
int add(int a,int b);

test.c

#include <stdio.h>

int add(int a,int b)
{
   return a + b;
}

hello.c

#include <stdio.h>
#include "test.h"
int main()
{
    printf("PI:%f\n",PI);
    printf("hello world:%d\n",add(1,5));
    return 0;
}

可见hello.c 里面使用了test.c里面实现的add函数,接下来就可以将test.c将test.c打包静态库和动态库了

打包静态库:
1. gcc -c test.c //生成test.o
2. ar rcs libtest.a test.o //生成静态库
3. gcc -o main hello.c -L. -ltest //链接生成main可执行文件

NDK 打包静态库和动态库(一),第1张

NDK 打包静态库和动态库(一),第2张

NDK 打包静态库和动态库(一),第3张

NDK 打包静态库和动态库(一),第4张

到此,静态库打包完成并可以运行main,输出正确结果
这里-L 是使用库的路径 .表示当前路径,-l表示使用指定路径下库的名称,这里是test

静态库:是一堆.o目标文件的集合,只用于生成可执行文件阶段,链接时,链接器从库中取出代码,复制到可执行文件中,所以会导致可执行文件体积变大,一般以.a结尾。
打包动态库:

  1. gcc -c test.c //生成test.o
  2. gcc -shared -fPIC -o libtest.so test.o //生成动态库
  3. gcc -o main hello.c -L. -ltest //链接生成main可执行文件
NDK 打包静态库和动态库(一),第5张

NDK 打包静态库和动态库(一),第6张

查看执行时是否需要链接libtest.so


NDK 打包静态库和动态库(一),第7张

显示not found,这时执行main会报错
NDK 打包静态库和动态库(一),第8张

因为找不到这个动态库,无法动态加载。

有两种办法解决:
第一种指定动态库路径,LD_LIBRARY_PATH=.


NDK 打包静态库和动态库(一),第9张

第二种,将libtest.so放到/usr/lib下, sudo mv libtest.so /usr/lib


NDK 打包静态库和动态库(一),第10张

动态库:链接阶段不会复制代码到可执行文件中,而是运行过程中由系统动态加载到内存供程序调用。

https://www.xamrdz.com/backend/3s51945694.html

相关文章: