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