Linux 生成so库文件并调用
为了不暴露源码,将c文件生成so动态库来给别人调用记录一下方法首先简单的创建一些测试文件:test.h a.c b.c c.c如下:test.h#include <stdio.h>void a();void b();void c();a.c#include "test.h"void a(){printf("aaa\n");}b.c#inc...
·
为了不暴露源码,将c文件生成so动态库来给别人调用
记录一下方法
首先简单的创建一些测试文件:test.h a.c b.c c.c
如下:
test.h
#include <stdio.h>
void a();
void b();
void c();
a.c
#include "test.h"
void a()
{
printf("aaa\n");
}
b.c
#include "test.h"
void b()
{
printf("bbb\n");
}
c.c
#include "test.h"
void c()
{
printf("ccc\n");
}
执行下面命令生成so文件:
gcc a.c b.c c.c -fPIC -shared -o libtest.so
下面写一个测试程序test.c,调用该so文件是否正常:
test.c
#include "test.h"
int main()
{
a();
b();
c();
return 0;
}
执行下面命令生成test可执行文件:
gcc test.c -L. -ltest -o test
下面执行看下结果:
可以看到能调用函数,证明so文件没问题。
对上面一些参数解释:
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-Lxxx:xxx表示指定库所在的位置,因为我是当前目录,所以是-L.
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称( l 的意思是lib,ltest即是去找libtest这个so)
下面介绍一下两个so相关命令
ldd
nm命令
可以看出so包含的三个函数,还有其它信息有兴趣自行看资料。
更多推荐
已为社区贡献3条内容
所有评论(0)