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_ */