.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