linux system libso
原文链接: linux system libso
###so库简介
so文件在linux中为共享库,与windows下的dll文件类似
so文件中的函数可以供多个进程调用,最大可能的提供二进制代码的复用
共享库可以使代码维护工作大大简化
so文件不可实现两进程的通信
###1,so文件编译方法
- so文件的源文件不需要由main函数,即使有也不会被加载。
- 编译的时候gcc需要加-fPIC选项,这可以使gcc产生与位置无关的代码
- 链接的时候gcc使用-shared选项,指示生成一个共享库文件
- 共享库文件名要以lib开头,拓展名为.so
```mkf
/makefile生成共享库/
.SUFFIXES: .cpp .o
CC=g++
SRCS=test.c
OBJS=$(SRCS:.cpp=.o)
EXEC=libtest.so
all: $(OBJS)
$(CC) -shared -o $(EXEC) $(OBJS)
@echo '-------------ok--------------'
.cpp.o:
$(CC) -Wall -g -fPIC -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f core*
###2,so文件的使用方法
- 在.bash_profile中添加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
- 或者将so文件放在linux的系统目录下
- 在c文件中使用so文件,首先要#include相关.h文件
- gcc链接时添加-L参数指明so文件存放路径,-l参数指明so文件名
/*例子:gcc -L. -ltest -o a a.o*/
```mkf
/*makefile编译使用so的程序*/
.SUFFIXES: .cpp .o
CC=g++
SRCS=a.c
OBJS=$(SRCS:.cpp=.o)
EXEC=a
all: $(OBJS)
$(CC) gcc -L. -ltest -o $(EXEC) $(OBJS)
@echo '-------------ok--------------'
.cpp.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f core*
```c
####c和cpp混合编译
当使用g++编译cpp文件使用gcc生成的so共享库的时候
- 可以把函数加上extern "C" int max(int a,int b);
- 也可以在.h中增加带有__cplusplus的预编译指令,解决混合编程
```c
/*头文件例子*/
#ifndef TEST_H_
#define TEST_H_
#ifdef __cplusplus
extern "C" {
#endif
int max(int a,int b);
int add(int a,int b);
#ifdef __cplusplus
}
#endif
#endif/*TEST_H_*/