Linux 共享库so文件

so文件与windows下的dll文件类似。

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

so文件编译方法:

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

-编译的时候gcc需要加 -fPIC选项,可以使gcc产生与位置无关的代码。   $(CC) -shared -o $(EXEC) $(OBJS)

-链接时gcc使用 -shared选项,指示生成一个共享库文件。    $(CC) -Wall -g -fPIC  -o  [email protected]  -c  $<

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

使用so文件还要提供头文件,格式如下:

#ifndef TEST_H_

#define TEST_H_

**********

#endif

so文件使用方法

-为让Linux找到so文件的位置,需要在.bash_profile中添加    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.    ,并让它生效。

-或者将so文件放入linux系统目录/usr/lib/ 中 ,但不推荐。

-在C文件中使用so文件,首先需要#include相关的头文件。

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

如 gcc -L. -ltest -o a a.o

-L. 是在当前路径下寻找so文件

-ltest 是要链接的库文件为 libtest.so

当在C++文件中调用C语言编写的共享库文件,需要修改函数声明:在头文件中添加extern “C”,否则用g++链接共享库时就会报错。

#ifndef SHARE_H_

#define SHARE_H_

extern "C" int max(int a, int b);

extern "C" int add(int a, int b);

#endif

为了兼容C++和C的混合编程,可以改进为

#ifndef SHARE_H_

#define SHARE_H_

#ifdef __cplusplus

extern "C"

{

#endif

int max(int a, int b);

int add(int a, int b);

#ifdef __cplusplus

}

#endif

#endif    /* TEST_H_ */

时间: 2024-12-07 14:57:19

Linux 共享库so文件的相关文章

Linux共享库.so文件的命名和动态链接

Linux中的.so文件 是动态链接的产物 共享库理解为提供各种功能函数的集合,对外提供标准的接口 Linux中命名系统中共享库的规则 主版本号:不同的版本号之间不兼容 次版本号:增量升级 向后兼容 发行版本号:对应次版本的错误修正和性能提升,不影响兼容性 Linux中的共享库并不都是这样的格式 比如GLibc的共享库命名为:libc-x.y.z.so 动态链接器也是GLibc的一部分,使用ld-x.y.z.so命名 libm(数学库)等 SO-NAME机制 系统和程序中要链接的共享库的格式一般

linux共享库

linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有一些更新,增加了一些接口符号且保持原来的接口符号不变,但保持后向兼容:主版本号和次版本号相同,发布版本号不同,表示库的一些修改修正,不增加新功能. SO-NAME软链接 SO-NAME 软链接:共享库 libname.so.x.y.z 的SO-NAME软链接命名为 libname.so.x 即去掉次

Linux 共享库(动态库)

Linux 系统上有两类根本不同的 Linux 可执行程序.第一类是静态链接的可执行程序.静态可执行程序包含执行所需的所有函数 - 换句话说,它们是"完整的".因为这一原因,静态可执行程序不依赖任何外部库就可以运行. 第二类是动态链接的可执行程序. 静态可执行程序与动态可执行程序比较 我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的: # ldd /sbin/sln not a dynamic executable "not a dynamic executa

linux环境 :Linux 共享库LIBRARY_PATH, LD_LIBRARY_PATH 与ld.so.conf

参考: 1. Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径.(该路径在默认路径之前查找) 移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中. 当执行函数动态链接.so时,如果此文件不在缺省目录下‘/usr/local/lib’ and ‘/usr/lib’. 那么就需要指

Linux共享库路径配置

今天在某测试服务器上使用ab压力测试工具时,出现了错误 ab: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory 查询资料,发现原因是是找不到正确的共享库路径. 参考资料: Linux共享库路径配置 /etc/ld.so.conf文件 解决方法: 1.添加搜索路径,并使用ldconfig命令更新. 查看/etc/ld.so

linux 共享库版本管理

原理 请看Linux 如何解决共享库的版本控制 我的理解 linux在系统内部将用到的共享库版本都保留下来,并没有覆盖.(不同soname) 调用程序和共享库在链接的时候已经记录下来了共享库的soname. libxx.so文件一般只是一个软链接.只是为了与gcc命令参数-lxx 中的xx名称一致.实际中可以在不同目录创建相同名字的libxx.so链接到不同soname的共享库.gcc -lxx使用-L参数指定不同目录位置,实现使用不同版本的共享库链接.在链接完成之后,libxx.so就失去了他

虚拟机Linux共享主机Windows文件夹

 虚拟机Linux共享主机Windows文件夹 2014-08-21      0个评论    来源:ClamReason的专栏   收藏    我要投稿 下面将桌面上的文件夹"1"作为共享文件夹共享给虚拟机中的Linux系统 在WMWare中给虚拟机添加一个Windows主机中的文件夹 此时Linux系统中就有对应的文件夹1了 至此你可以在Linux里面操作Windows中的文件夹了. 下面是操作后的结果 有时候为了方便在Linux使用或者安装软件等要求,会建立软连接,软连接的目

Android NDK开发及调用标准linux动态库.so文件

源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动将so文件和java应用一起打包成apk.对应:jni层c++开发 2.Cygwin:是windows平台上模拟Linux运行环境的工具,即window平台上的linux环境工具,so文件需要在linux平台上编译运行.对应:arm linux平台 3.CDT:eclipse下的C/C++开发工具,

windows动态链接库[DLL]与Linux共享库[SO]技术浅析

一.动态链接库的技术优点: 1)节省内存和磁盘空间:因为动态库在内存或磁盘中只需一份,便可供多个进程或程序使用. 2)模块化编程,方便协作:这一点静态库也能胜任. 3)使用动态加载DLL或SO时,便于模块升级,无需重新编译或链接整个程序. 二.windows的动态链接库: 1.windows的静态库生成的是.lib文件,其中包含了函数和数据实体,链接时合到程序中: 2.windows的动态库生成.dll文件并导出一个.lib文件,该.lib文件中的函数没有实体[不是一个 准确的说法],函数内部是