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操作系統(tǒng)不在當前目錄下尋找.so文件,需要在.bash_profile文件中添加如下語句
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
. .bash_profile 立即生效
默認lunix放在/usr目錄下 lib ?lib64(64位操作系統(tǒng))?
c++文件使用.so
頭文件如下
#ifdef __cplusplus
extern "c"{
#endif
int max(int a, int b);
int add(int a, int b);
#ifdef __cplusplus
}
#endif