so的封装和使用
背景
在linux平台下,要实现函数的封装,一般采用的是so动态库的形式
实现了函数的封装就意味着实现过程的隐藏
可以实现跨平台和跨语言的使用
实施步骤
生成so动态库
- 编写相应的c文件代码,实现函数功能,例如:
int sum(int a, int b)
{
    return a + b;
}
- 使用gcc编译时添加-fPIC选项,生成位置无关代码(由于动态库在编译时候无法知道偏移地址),同时添加-shared选项,生成so共享库
gcc -c test.c -fPIC -o test.o
gcc -shared -o libtest.so test.o
注:在linux和unix中的so文件,其扩展名必须是so,文件前缀也必须是lib。
使用so动态库
- 编写头文件,声明函数
#ifndef __SONAME_H
#define __SONAME_H
int sum(int a, int b);
#endif
- 在要使用的源文件内包含头文件
#include <stdio.h>
#include "soname.h"
int main()
{
    printf("sum = %d", sum(1,2));
    return 0;
}
- 编译时候建立连接,gcc链接时添加-L(代表在当前目录下查找so库),-l文件名(此时的文件名不包括前缀和后缀)
gcc –o test –L. –ltest main.o
修改配置文件使得可以在当前目录查找so库
cd
vi .bash_profile
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:.
. .bash_profile
so的封装和使用的更多相关文章
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
		using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ... 
- iOS开发之App间账号共享与SDK封装
		上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ... 
- Ajax实现原理,代码封装
		都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ... 
- 用C语言封装OC对象(耐心阅读,非常重要)
		用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ... 
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
		一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ... 
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
		前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ... 
- 封装集合(Encapsulate Collection)
		封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ... 
- CSharpGL(29)初步封装Texture和Framebuffer
		+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ... 
- CSharpGL(7)对VAO和VBO的封装
		CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ... 
- Swift -- 对AFN框架的封装
		Swift -- 对AFN框架的封装 一.封装AFN的目的 简单的说: 解耦 日常工作中,我们一般都不会去直接使用AFNetWorking来直接发送网络请求,因为耦合性太强,假设有多个控制器都使用AF ... 
随机推荐
- Eclipse 的 CheckStyle 插件
			Eclipse 的 CheckStyle 插件 1.简介 Checkstyle 是 SourceForge 下的一个开源项目,提供了一个帮助 JAVA 开发人员遵守某些编码规范的工具.它能进行自动化代 ... 
- File上次文件找不到文件相对绝对路径
			我的问题是因为文件的相对绝对路径上面有中午字符,把上面的中午字符全改为英文或者数字加特殊字符形式都可以 
- Flex 布局是什么?
			Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局.大理石平台价格 .box{ displ ... 
- 上传项目到码云或GitHub
			一.安装Git 官网下载地址:https://git-scm.com/download/win 安装完成后,配置环境变量即可, 打开cmd,输入 git,出现以下提示即表示安装成功: 二.生成ssh公 ... 
- objdump命令解析
			[objdump] 相关链接: 实例分析objdump反汇编用法 - 在路上 - CSDN博客 https://blog.csdn.net/u012247418/article/details/80 ... 
- Cow and Snacks
			 D. Cow and Snacks 参考:Codeforces 1209D. Cow and Snacks 思路:利用并查集,构建一个生成树,然后树的边数就是能够开心的客人的人数.用一个条件fin ... 
- C++入门经典-例7.2-利用构造函数初始化成员变量
			1:在创建对象时,程序自动调用构造函数.同一个类中可以有多个构造函数,通过这样的形式创建一个CPerson对象,例如: CPerson p1(0,"jack",22,7000); ... 
- TCP最大报文段MSS源码分析
			概述 本文主要对MSS相关的几个字段结合源码流程进行分析: 字段含义 user_mss(tcp_options_received)–用户配置的mss,优先级最高: mss_clamp(tcp_opti ... 
- Java Jsch SFTP 递归下载文件夹
			Java Program For Downloading Folder Content recursively from SFTP Server How to download folder from ... 
- hive 使用笔记(table format;lateral view横表转纵表)
			1. create table 创建一张目标表,指定分隔符和存储格式: create table tmp_2 (resource_id bigint ,v int) ROW FORMAT DELIMI ... 
