当前位置: 首页 > news >正文

如何实现.so共享库文件

.so共享库相当于window中的.DLL文件

两个进程同时调用了.so文件,进程就会加载的.so文件到各自的内存空间,而不能实现进程间通讯。

 

.so文件编译的方法:

 -so文件不需要main文件,即使有也不会被执行。

-编译gcc时候需要加-fPIC选项,可以产生与位置无关的代码。(首地址,偏移地址)

-链接的时候gcc需要加-shared选项,指示生成一个共享库文件。

-共享库文件需以lib开头,扩展名为.so。

 

###################动态库的编译makefile文件
.SUFFIXES: .c .o


SRCS=libso.c
OBJS=$(SRCS:.c=.o)
EXES=libso.so
CC=gcc

start: $(OBJS)
  $(CC) -shared -o $(EXES) $(OBJS) #-o参数写在后面不然会出错
  @echo "------------------ok----------------"
.c.o:
  $(CC) -g -fPIC -o $@ -c $<
clean:
  rm -rf $(OBJS)

 ############################

 

 

so文件的使用方法:

 -为了让Linux 可以找到so文件的位置,需要在.bash.profile中添加

 -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

 -或者将so文件放入linux的系统目录/usr/lib/

 -在c文件中使用so文件,首先需要#inlcude相关头文件。

gcc连接时候添加-L参数指明so文件存放的路径,-l参数指明so文件名

以libtest.so文件在当前路径下举例:

gcc -L.  -ltest  -o a  a.o  ##-ltest有时候需要加载a.o后面否则报错ubantu14.04中

其中 -L.的意思就是在当前路径下寻找so文件,

-ltest意思就是要连接libtest.so这个库文件,

-o a就是编译后可执行文件名为a这个文件。

 

 

 

.SUFFIXES: .c .o


SRCS=a.c
OBJS=$(SRCS:.c=.o)
EXES=a
CC=gcc

start: $(OBJS)
  $(CC) -L.  -ltest  -o $(EXES) $(OBJS) #-o参数写在后面不然会出错
  @echo "------------------ok----------------"
.c.o: 
  $(CC) -g  -o $@ -c $< 
clean:
  rm -rf $(OBJS)

###############################头文件中同时兼任C/C++

#ifndef LIBSO_H_
#define LIBSO_H_

#ifndef __cplusplus//c++特有的宏定义
extern "C" //告诉c++编译器这是C代码
{
#endif

int max(int a, int b);
int add(int a , int b);

#ifndef __cplusplus
}
#endif

#endif /* LIBSO_H_ */

 

##################################################

http://www.jb51.net/article/46005.htm

 

转载于:https://www.cnblogs.com/yuankaituo/p/4341635.html

相关文章:

  • 关于四则运算程序的测试
  • 软件工程师的属性与发展
  • MVC 外网 上传 下载 实现方式(一)
  • asp.net Ajax Post 请求一般处理程序
  • 我的博客开通了!
  • ASP.NET MVC3默认提供了11种ActionResult的实现
  • 实现GetHashCode时要遵循的规则
  • 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
  • 用linqPad帮助你快速学习LINQ
  • Cacti监控Tomcatserver实现过程
  • C++ 多继承与虚基类
  • Set集合
  • Solr4.7从数据库导数据
  • 【转】 Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
  • hdu 2335 Containers
  • @angular/forms 源码解析之双向绑定
  • [译] React v16.8: 含有Hooks的版本
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • bootstrap创建登录注册页面
  • IndexedDB
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Kibana配置logstash,报表一体化
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mongo索引构建
  • npx命令介绍
  • Odoo domain写法及运用
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python3爬取英雄联盟英雄皮肤大图
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-flux杂记
  • Vue.js 移动端适配之 vw 解决方案
  • 从零开始的无人驾驶 1
  • 怎么将电脑中的声音录制成WAV格式
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​力扣解法汇总946-验证栈序列
  • # include “ “ 和 # include < >两者的区别
  • $().each和$.each的区别
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (ZT)出版业改革:该死的死,该生的生
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (分布式缓存)Redis持久化
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件—git忽略文件