so文件在linux中为共享库,与windows下的dll类似。

so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用。

共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性的时候,用户只需要获得升级后的so并安装他就可以。

注意:即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间。

so文件编译方法

--so文件的源文件中不需要main函数,即使有也不会被执行。

--编译的时候gcc需要加-fPIC选项,这可以使gcc产生与位置无关的代码。

在操作系统中,执行一个进程的时候,会将这个进程的代码加载到内存,系统为这段程序分配一个入口地址(一般就是main函数的地址),

这个程序中的其他函数的地址都是相对地址(相对于入口地址),所以在进程中,只有程序的入口地址是绝对地址,其他函数的地址都是相对

地址,对于so共享库文件,在编译的时候不需要给so文件相对地址,因为so文件没有入口地址,它是用来被其他进程调用的

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

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

so文件使用方法

--为了让Linux能找到so文件的位置,需要在.bash_profile中添加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

因为linux默认不在当前目录下寻找可执行文件,so也是可执行文件,所以so文件也需要配置环境变量,增加在本地查找。

--或者将so文件放入linux系统目录/user/lib(不建议这么做)

--在c文件中使用so文件,首先需要#include相关的.h文件。

--gcc链接时添加 -L参数指明so文件存放路径,-l(L)参数执行so文件名

以libtest.so文件在当前路径下举例: gcc -L. -ltest -o a a.o

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

-ltest意思为要链接libtest.so这个库文件

-o a意思是编译后可执行文件名为a

当我们在cpp文件中包含test.h文件,用g++连接libtest.so这个库会报错

为了使我们编写的so文件同事可以被c或者c++调用,我们需要修改一下h文件中的函数声明部分。

增加带有__cplusplus(两个下划线)的预编译指令。

__cplusplus(两个下划线)是c++编译器预定义的一个宏,比如用g++的时候这个宏就被提前定义了。

extern "C" extern这个是c++下的关键字,C语言没有这个关键字,表示这是一个C语言函数

--注意:"C"这个字符是大写

在动态链接库中查找某一个函数是否存在以及函数入口地址:

假设动态链接库为yourLib.so,函数名字为yourFunction,则如下:

nm -D yourLib.so |grep -w yourFunction

转:linux下共享库的注意点之-fpic

转: http://www.cnblogs.com/leo0000/p/5691483.html linux下共享库的注意点之-fpic 在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单 ...

Linux动态共享库

Linux操作系统上面的动态共享库大致分为三类:   一.操作系统级别的共享库和基础的系统工具库 libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/us ...

Linux下共享库嵌套依赖问题 (转载)

转自:http://my.oschina.net/moooofly/blog/506466 问题场景: 动态库 librabbitmq_r.so 内部依赖动态库 libevent_core.so 和 ...

linux下共享库的注意点之-fpic

在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单的例子: #include int fun1() { printf("fun1\n") ...

linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”. 2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误. 以 ...

linux共享库

linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...

【转载】Linux下动态共享库加载时的搜索路径详解

转载自:http://www.eefocus.com/article/09-04/71617s.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading ...

Linux静态库和共享库

1.什么是静态库静态库类似windows中的静态lib 关于windows中的静态lib,可参考 Windows动态链接库DLL 特点:包含函数代码声明和实现,链接后所有代码都嵌入到宿主程序中. 只在 ...

Linux下动态共享库加载及使用详解【转】

Linux命令把共享库export,Linux Linux共享库相关推荐

  1. linux字符图形命令,神奇的 Linux 命令行字符形状工具 boxes | Linux 中国

    原标题:神奇的 Linux 命令行字符形状工具 boxes | Linux 中国 本文将教你如何在 Linux 命令行终端中使用 boxes 工具绘制字符形状图形来包装你的文字让其更突出. -- Ja ...

  2. 视频教程- Linux命令技巧及黑客防御实战-Linux

    Linux命令技巧及黑客防御实战 资深DevOps工程师,曾经在华为,乐逗游戏工作,目前就职于知名物流公司工作 希望结合工作实践 给大家带来很多干货 周龙 ¥48.00 立即订阅 扫码下载「CSDN程 ...

  3. Linux命令把共享库export,实用linux命令

    1)查看一个文件夹下有多少个文件 ls  *.*|wc –l 补充说明: wc: -l 统计行数 -w 统计单词数 -c 统计字节数 -m 统计字符数 2)统计一个文件的行数的命令(也就是可以统计一个 ...

  4. Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试

    用C编译器编译源文件:gcc 源文件 -o 可执行文件名 详细步骤: gcc -E a.c -o a.i预处理器将头文件展开,宏替换,去掉注释 gcc -S a.i -o a.s编译器将C文件变成汇编 ...

  5. linux命令行学习游戏,如何在Linux命令行中下载GOG游戏

    如果你是一个游戏玩家同时也是一个Linux用户,你可能很高兴在GOG在几个月前宣布它会在你最喜欢的操作系统上推出游戏.如果你之前从来没有听说过GOG,我鼓励你看看他们的产品目录中的"很棒的老 ...

  6. linux编辑搜索命令,Linux 命令大全提供 500 多个 Linux 命令搜索

    Linux命令分类 这里存放Linux 命令大全并不全,你可以通过linux-command来搜索,它是把 command 目录里面搜集的命令,生成了静态HTML并提供预览以及索引搜索. 文件传输 b ...

  7. python实现linux命令输出两列_Python实现Linux命令xxd -i功能

    def Xxdi(): #解析命令行选项及参数 ([base, cols, strip], [inFile, outFile]) = ParseOption() import os if os.pat ...

  8. linux命令大全私房菜,41个linux命令大全(鸟哥的私房菜)

    转http://www.xmws.cn/show-87-419-1.html 41个linux命令大全 发布作者:微思网络   发布时间:2017-01-10   浏览量:709次 学过linux的人 ...

  9. python中执行linux命令(调用linux命令)_常见Python中调用Linux命令

    有时候我们需要从Python中执行Linux命令,下面就介绍几种方法? 1. os 模块: 1.1 os.system 函数: system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果. ...

  10. 实验一 linux命令使用,实验一XXXXX常用linux命令的使用(一)

    以下为<实验一XXXXX常用linux命令的使用(一)>的无排版文字预览,完整格式请下载 下载前请仔细阅读文字预览以及下方图片预览.图片预览是什么样的,下载的文档就是什么样的. 实验一 常 ...

最新文章

  1. python 如何暂停程序?程序阻塞 (input()、time.sleep()、os.s*stem(“pause))
  2. MS SQL入门基础:数据查询--SELECT语句
  3. axios请求拦截器错误_Axios使用拦截器全局处理请求重试
  4. 存储计算解耦合,构建中国人英语语音数据库
  5. centos php 默认安装目录,centos系统中的软件安装目录在哪
  6. Redis 高可用性实践
  7. 电子计算机第一代到第四代,从第一代电子计算机到第四代计算机的体系结构都是由运算器、控制器、存储器、输入设备和输出设备组成的,称为( )体系结构。...
  8. delphi ehlib 添加选择框_教你用CASS10.1,在宗地图中添加“亩”注记
  9. 双系统在linux中修复引导文件,windows ubuntu双系统重装后修复grub引导
  10. Java Socket聊天室
  11. 【UE·蓝图】UE4蓝图MediaPlayer注意事项
  12. python两个表格相同数据筛选的方法_浅谈pandas筛选出表中满足另一个表所有条件的数据方法...
  13. Redis:字符串MSET、MSETNX、MGET命令介绍
  14. 度度熊保护村庄 HDU - 6080 floyd最小环/叉积判左右
  15. Photoshop设计网站原型图
  16. unity抠人像原理_抠出精细发丝人像图片的PS抠图教程
  17. 交换机端口隔离功能的使用意义
  18. 亚马逊云科技的Graviton3为什么只有64核,官方回应来了!
  19. Oracle高级函数:rank over partition by
  20. 色彩校正中的 gamma 值是什么?

热门文章

  1. Ceph专题三 Ceph与OpenStack集成和行业应用
  2. 如何解决本地虚拟机安装宝塔面板访问面板后台打不开?
  3. 从XXX航航班延误看软件风险管理
  4. JS字符串拼接的几种方式及其性能比较
  5. 路由器的信号无法连接到服务器,华为路由器可以搜到 Wi-Fi 信号 但无法连接 解决办法...
  6. 基于Java毕业设计音乐播放平台源码+系统+mysql+lw文档+部署软件
  7. 【分享】华为FreeBuds 系列耳机无法连接解决方案!
  8. matlab mda,MATLAB中最基本函数plot()的用法
  9. 图解TCP/IP知识点
  10. 微型计算机40g,兔子变乌龟? 固态硬盘老化极限测试