如何实现.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
如何实现.so共享库文件的更多相关文章
- Linux 中安装软件报缺少共享库文件的错误
linux 安装一些如软件 或者相关的模块时,经常报出缺少一些依赖包的 libxxx.so等的共享库文件 首先找到 该共享库文件 然后查看/etc/ld.so.conf 这个文件记录了编译时使用的动态 ...
- LOAD - 装载或重载一个共享库文件
SYNOPSIS LOAD 'filename' DESCRIPTION 描述 这个命令装载一个共享库文件到PostgreSQL服务器的地址空间. 一旦一个文件被装载,如果该文件前面曾经装载过,那么服 ...
- Linux下Qt调用共享库文件.so
修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ...
- 共享库的使用(.so)文件
1.共享库的概念 2.创建共享库命令 gcc -shared -fpci -o lib/libmath.so obj/mymath.o 具体加不加 fpci 这个要看平台支持吧支持:具体详情可以查阅 ...
- QT共享库的创建与调用(初级)(附:UI界面不能被改变的其中一个原因)
背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再 ...
- Linux Linux共享库
so文件在linux中为共享库,与windows下的dll类似. so文件中的函数可供多个进程调用,最大可能的提供二进制代码复用. 共享库可以使代码的维护工作大大简化,当修正了一些错误或者添加了新特性 ...
- 添加Ubuntu的库文件路径
添加Ubuntu的库文件路径 http://blog.csdn.net/r91987/article/details/6879062 关于ubuntu添加共享库路径: 1. 将绝对路径写入 /etc/ ...
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- linux下的共享库(动态库)和静态库
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
随机推荐
- VC++从入门到精通视频教程网址
视频教程网址:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0607/820674.html
- hdoj 5112 A Curious Matt
A Curious Matt Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) ...
- Mysql相关问答
问:我们团队中的一人想要使用 bigint 字段类型来代替 25-30 长度的 varchar 类型来存储 CRC64 数据,然后将索引也改成 bigint 的索引,这会节省索引的空间.请问这否是合理 ...
- POJ3111 K Best
Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...
- 树莓派(Rospberry Pi B+)到货亲測
1 图鉴 Rospberry Pi B+最终在今天下午有蜗牛快递公司圆*送到了.B+主要是添加了2个USB,添加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 w ...
- 理解C# Lazy<T>
1.Lazy<T>解决什么问题? 考虑下面的需求,有个对象很大,创建耗时,并且要在托管堆上分配一大块空间.我们当然希望,用到它的时候再去创建.也就是延迟加载,等到真正需要它的时候,才去加载 ...
- Android ListView分页加载时图片显示问题
场景:Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的. 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来. Bug重现: 1,加载 ...
- How to Enable Multi-Touch
This is a frequently asked question. Multi-touch feature is available on both iOS & Android port ...
- 可拖拽重排的CollectionView
来源:wazrx 链接:http://www.jianshu.com/p/8f0153ce17f9 写在前面 这段时间都在忙新项目的事儿,没有时间倒腾,这两天闲下来,想着一直没有细细的研究Collec ...
- 关于Xcode7中的tbd文件
tbd 是 text-based stub libraries的意思, 是苹果在Xcode7中使用的一个技术,便于减少Xcode7中SDK的体积. 下面讲解下Xcode7如何通过tbd这个技术减少SD ...