so共享库
来源:互联网 发布:网络音响 编辑:程序博客网 时间:2024/06/16 06:26
共享库so
- so文件在Linux中是共享库,与windows中的dll类似。
- so文件中的函数可供多个进程调用,最大实现二进制代码的复用。
- 共享库为维护提供方便,当修正一些错误的时候用户只需要获得升级后的so并且安装即可。
注意:
同一个so会被不同进程加载到不同的内存段。
so文件编译
- so文件的源文件不需要main()函数,即使有也不会被执行
- 编译的时候gcc需要加一些-fPIC选项,加这个目的是so里面的代码与位置无关,只需要编译成二进制可执行就行
- 连接的时候gcc使用-shared选项,指示生成一个共享库文件。
- 共享库文件名称要以lib开头,拓展名为.so
例子说明
比如我们现在来写一个so文件实现简单的功能
文件名称叫做test.c
int max(int a,int b){ return a+b;}int add(int a,int b){ return a+b;}
编写makefile文件
$(CC) -Wall -g -fPIC -o $@ -c $<
其中fPIC表示代码生成和位置无关
.SUFFIXES: .c .oCC=gccSRCS=test.cOBJS=$(SRCS:.c=.o)EXE=libtest.soall: $(OBJS) $(CC) -o $(EXE) $(OBJS) @echo '^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^'.c.o: $(CC) -Wall -g -fPIC -o $@ -c $<clean: -rm -f $(OBJS) -rm -f core*
然后执行在代码所在目录执行make
就会生成libtest.so文件
对于so文件需要编写头文件,来说明so里面有什么函数,函数参数和返回值是什么。
所以我们现在来按照上面的编写头文件test.h
#ifndef TEST_H_#define TEST_H_int max(int a,int b);int add(int a,int b);#endif
为了能让Linux找到so文件的位置,需要:
.bash_profile
中添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
- 或者将so放入
usr/lib
目录 - 在c文件中使用so文件,首先需要#include相关h文件
- gcc连接时候需要 -L参数指定so文件的存放路径,-l参数指定so文件名称
以libtest.so为例子gcc -L -ltest -o a.o其中-L表示在当前目录下寻找so文件-ltest意思为要连接libtest.so这个库文件-o a意思是为编译后的可执行文件名为a
- 或者将so放入
上面我们已经可以成功编写一个so动态库并添加到我们的当前目录中去.下面我们将使用这个so动态库
text.h
#ifndef TEST_H_#define TEST_H_#ifdef __cplusplusextern "C"{#endifint max(int a, int b);int add(int a, int b);#ifdef __cplusplus}#endif#endif
其中头文件中的extern "C"
声明所包含的代码是用C的方式写的,其中extern "C"
是C++的关键字,是告诉C++编译器,所包含代码是用C写的。
其中#ifdef __cplusplus
是为了兼容C/C++混合开发准备的,只有是C++编译器的时候才识别这个宏定义。
makefile文件
是在连接的时候加$(CC) -L. -ltest -o $(EXE) $(OBJS)
参数-L,-ltest
意思是在当前目录下找到test这个库编译。
.SUFFIXES: .c .oCC=gccSRCS=a.c OBJS=$(SRCS:.c=.o)EXE=aall: $(OBJS) $(CC) -L. -ltest -o $(EXE) $(OBJS) @echo '^_^ ^_^ ^_^ ^_^ ^_^ ^_^ OK ^_^ ^_^ ^_^ ^_^ ^_^ ^_^'.c.o: $(CC) -Wall -g -o $@ -c $<clean: -rm -f $(OBJS) -rm -f core*
0 0
- so共享库
- 共享文件库so
- android共享库(so)编译
- jni 调用共享SO库
- 共享库(.so文件)
- qt调用so共享库
- Linux的共享库so
- 静态库 .a 转成共享库 .so
- linux 下创建共享库.so
- linux 下创建共享库.so
- Linux上创建共享库so
- Linux共享库文件(so)用法
- linux下制作共享库.a .so
- linux 下创建共享库.so
- linux 下创建共享库.so
- CentOS缺少共享库:libstdc++.so.6
- centos缺少共享库:libstdc++.so.6
- NDK调用第三方so共享库
- 80x86的寻址方式
- Qt Style Sheets(qt样式表)
- 编写C代码makefile模板
- 什么是框架
- stm32+DS1302+TM1638驱动程序
- so共享库
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛-移动距离
- Windows下编译breakpad (2)
- 14.线程面试题二
- 结束进程的常见方式
- Dubbo框架学习笔记(四)
- CentOS 环境变量编辑、保存、立即生效的方法
- 感知机随机梯度和梯度下降法区别
- ubuntu14.04 安装anaconda+pycharm+cuda+cudnn+theano0.90+keras2.0.2+tensorflow1.1.0