so文件是lunix中的共享库与windows下dll文件类似
制作.so文件
gcc时候加-fPIC,这可以使gcc生产与位置无关(与具体地址无关的代码 偏移地址 首地址)
链接时候gcc使用-shared选项,指示生成一个共享库文件
共享文件名要以lib开头,扩展名为.so
第一步,编写源文件,源文件里不能有main函数,so用C写最好不要用C++
第二部,编写makefile,so文件必须用lib开头,扩展名必须用.so,编译的时候gcc加-fPIC选项.链接的时候gcc -shared选项
makefile
.SUFFIXES:.c .o
CC=gcc
SRCS=myso.c
OBJS=$(SRCS:.c = .o)
EXEC=libmyso.so
start:$(OBJS)
$(CC) -shared -o $(EXEC) $(OBJS)
@echo "-------ok------"
.c.o:
$(CC) -fPIC -Wall -g -o $@ -c $<
clean:
rm -rf $(EXEC) $(OBJS)
使用.so
第一步,在源文件当中include相关头文件
第二步,在gcc链接的时候增加-l选项,告诉gcc需要链接指定的so文件
$(CC) -o $(EXEC) $(OBJS) -lmyso -L.
gcc不会再当前目录下寻找.so,让gcc在当前目录寻找.so,我们需要加 -L.(.表示当前目录)
对于lunix操作系统不在当前目录下寻找.so文件,需要在.bash_profile文件中添加如下语句
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
. .bash_profile 立即生效
默认lunix放在/usr目录下 lib lib64(64位操作系统)
c++文件使用.so
头文件如下
#ifdef __cplusplus
extern "c"{
#endif
int max(int a, int b);
int add(int a, int b);
#ifdef __cplusplus
}
#endif