.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

如何实现.so共享库文件的更多相关文章

  1. Linux 中安装软件报缺少共享库文件的错误

    linux 安装一些如软件 或者相关的模块时,经常报出缺少一些依赖包的 libxxx.so等的共享库文件 首先找到 该共享库文件 然后查看/etc/ld.so.conf 这个文件记录了编译时使用的动态 ...

  2. LOAD - 装载或重载一个共享库文件

    SYNOPSIS LOAD 'filename' DESCRIPTION 描述 这个命令装载一个共享库文件到PostgreSQL服务器的地址空间. 一旦一个文件被装载,如果该文件前面曾经装载过,那么服 ...

  3. Linux下Qt调用共享库文件.so

    修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ...

  4. 共享库的使用(.so)文件

    1.共享库的概念 2.创建共享库命令 gcc -shared -fpci -o lib/libmath.so obj/mymath.o 具体加不加 fpci 这个要看平台支持吧支持:具体详情可以查阅 ...

  5. QT共享库的创建与调用(初级)(附:UI界面不能被改变的其中一个原因)

    背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再 ...

  6. Linux Linux共享库

    so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性 ...

  7. 添加Ubuntu的库文件路径

    添加Ubuntu的库文件路径 http://blog.csdn.net/r91987/article/details/6879062 关于ubuntu添加共享库路径: 1. 将绝对路径写入 /etc/ ...

  8. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  9. linux下的共享库(动态库)和静态库

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

随机推荐

  1. 如何把jquery 的dialog和ztree结合

    第一步:先准备好juqury-ui.ztree 的js文件和css 文件 第二步:example.jsp文件代码中写 ..引入jqueryui.ztree 的js和css文件 <body> ...

  2. ThinkPHP3.1快速入门(2)数据CURD

    上一篇中,我们了解了ThinkPHP的基础部分,以及如何创建一个控制器和模板,并知道了M方法的用法,本篇将会讲解下数据的CURD操作,探索下更多的数据操作. CURD CURD是一个数据库技术中的缩写 ...

  3. TreeView查获节点并选中节点

    TreeView查获节点并选中节点如果有多个节点则会继续查找下一个节点 支持关键字搜索 private void SearchNodes(string SearchText, TreeNode Sta ...

  4. Openstack中间DVR Part1 -- 东西走向的交通处理

    作者:Liping Mao  发表于:2014-07-04 版权声明:能够随意转载.转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 在Openstack中L3router会造成流量集中 ...

  5. 【Heritrix基础教程之1】在Eclipse中配置Heritrix

    一.新建项目并将Heritrix源代码导入 1.下载heritrix-1.14.4-src.zip和heritrix-1.14.4.zip两个压缩包,并解压,以后分别简称SRC包和ZIP包: 2.在E ...

  6. oc学习笔记2

    .oc中的BOOL类型 oc中的BOOL类型的值为YES和NO,有点小奇怪 在oc中YES不等于1,但是NO一定等于0,所以不要把1和YES来比较 .消息发送 在oc中,经常使用这样的术语:将allo ...

  7. UDID

    大多数应用都会用到苹果设备的UDID号,UDID通常有以下两种用途: 1)用于一些统计与分析目的:[第三方统计工具如友盟,广告商如ADMOB等] 2)将UDID作为用户ID来唯一识别用户,省去用户名, ...

  8. HDU2001java

    import java.util.*;import java.text.DecimalFormat;class Main{public static void main(String args[]){ ...

  9. C#读取Exeal文件

    今天写一个读取Exeal的时候遇到一个问题就是引用了Mircosotf.Office.Interop.Exeal类库的时候没有办法读取到 纠结了好久百度了一下发现别人是这样写的using Exeal= ...

  10. KALI 2.0优化

    1.首选项没有主菜单,系统管理 apt-get install alacarte 2.APT源 #官方源deb http://http.kali.org/kali kali main non-free ...