背景

在linux平台下,要实现函数的封装,一般采用的是so动态库的形式

实现了函数的封装就意味着实现过程的隐藏

可以实现跨平台和跨语言的使用

实施步骤

生成so动态库

  1. 编写相应的c文件代码,实现函数功能,例如:
int sum(int a, int b)
{
return a + b;
}
  1. 使用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动态库

  1. 编写头文件,声明函数
#ifndef __SONAME_H
#define __SONAME_H int sum(int a, int b); #endif
  1. 在要使用的源文件内包含头文件
#include <stdio.h>
#include "soname.h" int main()
{
printf("sum = %d", sum(1,2));
return 0;
}
  1. 编译时候建立连接,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的封装和使用的更多相关文章

  1. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  3. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  4. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  5. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  6. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  7. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  8. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

  9. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

  10. Swift -- 对AFN框架的封装

    Swift -- 对AFN框架的封装 一.封装AFN的目的 简单的说: 解耦 日常工作中,我们一般都不会去直接使用AFNetWorking来直接发送网络请求,因为耦合性太强,假设有多个控制器都使用AF ...

随机推荐

  1. java中报错:problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError

    今天和往常一样打开项目,竟然报错problem with class file or dependent class; nested exception is java.lang.NoClassDef ...

  2. Java线程之wait()、notify()、notifyAll()

    翻译:https://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 简述 java中Objct对象包含三个 ...

  3. Java-JDK-windows和linux版-百度云下载

    链接: https://pan.baidu.com/s/15vjk4PNzuItd5vHJ6deq3Q 关注以下公众号,回复[9757],获取提取码 linux:jdk-8u221-linux-x64 ...

  4. VS下创建网站发布到IIS

    http://www.51zxw.net/show.aspx?id=27297&cid=410

  5. Nginx事件管理之epoll模块

    1. epoll 原理 假设有 100 万用户同时与一个进程保持着 TCP 连接,而每一时刻只有几十个或几百个 TCP 连接时活跃的(接收到 TCP 包),也就是说,在每一时刻,进程只需要处理这 10 ...

  6. LeetCode 134. 加油站(Gas Station)

    题目描述 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其 ...

  7. 浏览器缓存及vw和vh的使用

    在浏览器缓存中不仅有 cookie 还有了别的选择 Storage 浏览器又分了两种缓存:sessionStorage localStorage localStorage 缓存:是一种永久的缓存,也就 ...

  8. JS遍历OCX方法

    /----查看OCX组件的属性 <html> <head> <title>OCX</title> <meta http-equiv="C ...

  9. HTML中meta=“viewport”的介绍

    viewport就是浏览器上用来显示网页的那部分区域 layout viewport:整个网页所占据的区域(包括可视也包括不可视的区域)  默认的 visual viewport:网页在浏览器上的可视 ...

  10. LC 894. All Possible Full Binary Trees

    A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...