码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 共享库so文件

时间:2015-07-03 10:27:26      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

so文件与windows下的dll文件类似。
即使不同的进程调用同一个so文件,通过共享库并不能实现不同进程间的通讯,因为同一个so被不同的进程加载到不同的内存空间。
 
so文件编译方法:
-so文件的源文件中不需要有main函数,即使有也不会被执行。
-编译的时候gcc需要加 -fPIC选项,可以使gcc产生与位置无关的代码。   $(CC) -shared -o $(EXEC) $(OBJS)
-链接时gcc使用 -shared选项,指示生成一个共享库文件。    $(CC) -Wall -g -fPIC  -o  $@  -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_ */

 

Linux 共享库so文件

标签:

原文地址:http://www.cnblogs.com/shih/p/4617868.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!