Linux的共享库so
2016-07-19 22:02
471 查看
so文件在Linux中为共享库,与Windows下的dll类似。
so文件可供多个进程调用,但通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间。
一、so文件的编译方法
so文件不需要有main函数,它需要进程调用它。
编译时,gcc需要加 –fPIC 选项,可使gcc产生与位置无关的代码。
链接时,gcc使用 –shared 选项,指示生成一个共享库文件。
共享库的文件名以lib开头,扩展名为 .so。
编写so文件的例子:
test.c文件中直接写函数,不要头文件和main函数。
makefile文件如下:
.SUFFIXES: .c .o
CC=gcc
SRCS=test.c
OBJS=$(SRCS:.c=.o)
EXE=libtest.so
all: $(OBJS)
$(CC) -o
$(EXE) $(OBJS) -shared
@echo '^_^^_^^_^^_^^_^^_^OK^_^^_^^_^^_^^_^^_^'
.c.o:
$(CC) -Wall -g -fPIC -o $@ -c $<
clean:
-rm -f $(OBJS)
-rm-f core*
接下来编写so文件的头文件,如下:
#ifndef TEST_H_
#define TEST_H_
int max(int a,int b);
int add(int a,int b);
#endif
/* TEST_H_ */
二、so文件的使用方法
为了让Linux能找到so文件的位置,需要在.bash_profile中添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 【改完后用 ..bash_profile命令使其生效】
或者将so文件放在Linux的系统目录/usr/lib/
调用so文件的例子:
a.c文件
#include
<stdio.h>
#include
"test.h"
int main(int arg,
char *args[])
{
printf("max =%d\n", max(4,5));
printf("add =%d\n", add(4,5));
return 0;
}
makefile文件:
.SUFFIXES: .c .o
CC=gcc
SRCS=a.c
OBJS=$(SRCS:.c=.o)
EXE=a
all: $(OBJS)
$(CC) -L. -ltest -o
$(EXE) $(OBJS)
@echo '^_^^_^^_^^_^^_^^_^OK^_^^_^^_^^_^^_^^_^'
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
-rm -f $(OBJS)
-rm-f core*
其中,gcc -L. -ltest -o
a a.o
-L.表示在当前路径下寻找so文件
-ltest意思为要链接libtest.so这个库文件
-o a 意思为编译后的可执行文件名为a
问题:当在cpp文件中包含test.h文件时,用g++链接libtest.so这个库时会报错。
解决方法:为了使编写的so文件同时可以被C或者C++文件调用,则需要修改一下h文件中的函数申明部分。增加带有_cplusplus的预编译指令。_cplusplus是c++编译器预定义的一个宏。若使文件用C++和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_ */
so文件可供多个进程调用,但通过共享库并不能实现不同进程间的通讯,因为同一个so被不同进程加载到不同的内存空间。
一、so文件的编译方法
so文件不需要有main函数,它需要进程调用它。
编译时,gcc需要加 –fPIC 选项,可使gcc产生与位置无关的代码。
链接时,gcc使用 –shared 选项,指示生成一个共享库文件。
共享库的文件名以lib开头,扩展名为 .so。
编写so文件的例子:
test.c文件中直接写函数,不要头文件和main函数。
makefile文件如下:
.SUFFIXES: .c .o
CC=gcc
SRCS=test.c
OBJS=$(SRCS:.c=.o)
EXE=libtest.so
all: $(OBJS)
$(CC) -o
$(EXE) $(OBJS) -shared
@echo '^_^^_^^_^^_^^_^^_^OK^_^^_^^_^^_^^_^^_^'
.c.o:
$(CC) -Wall -g -fPIC -o $@ -c $<
clean:
-rm -f $(OBJS)
-rm-f core*
接下来编写so文件的头文件,如下:
#ifndef TEST_H_
#define TEST_H_
int max(int a,int b);
int add(int a,int b);
#endif
/* TEST_H_ */
二、so文件的使用方法
为了让Linux能找到so文件的位置,需要在.bash_profile中添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 【改完后用 ..bash_profile命令使其生效】
或者将so文件放在Linux的系统目录/usr/lib/
调用so文件的例子:
a.c文件
#include
<stdio.h>
#include
"test.h"
int main(int arg,
char *args[])
{
printf("max =%d\n", max(4,5));
printf("add =%d\n", add(4,5));
return 0;
}
makefile文件:
.SUFFIXES: .c .o
CC=gcc
SRCS=a.c
OBJS=$(SRCS:.c=.o)
EXE=a
all: $(OBJS)
$(CC) -L. -ltest -o
$(EXE) $(OBJS)
@echo '^_^^_^^_^^_^^_^^_^OK^_^^_^^_^^_^^_^^_^'
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
-rm -f $(OBJS)
-rm-f core*
其中,gcc -L. -ltest -o
a a.o
-L.表示在当前路径下寻找so文件
-ltest意思为要链接libtest.so这个库文件
-o a 意思为编译后的可执行文件名为a
问题:当在cpp文件中包含test.h文件时,用g++链接libtest.so这个库时会报错。
解决方法:为了使编写的so文件同时可以被C或者C++文件调用,则需要修改一下h文件中的函数申明部分。增加带有_cplusplus的预编译指令。_cplusplus是c++编译器预定义的一个宏。若使文件用C++和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_ */
相关文章推荐
- Android学习笔记之Shared Preference
- 配置lamp排错指南
- ORA-04031问题
- linux 内存释放
- 手动释放linux服务器内存
- ora-01034,ora-27101
- Cache占用过多内存导致Linux系统内存不足问题排查
- 使用LDAP给Linux鉴权和进行用户管理
- linux查看系统版本(32位/64位)的方法
- linux 内存使用率
- Linux free 指令解读
- 共享内存的进程间通信库
- Linux文件系统详解
- 32位和64位操作系统
- ORACLE将执行过的SQL语句存放在内存的共享池
- g++生成共享库之参数fPIC
- Android 快速集成指南 - ShareSDK Wik
- SecurePreference的添加方法
- relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recomp
- 上线被拒,说是 分享路径不合适,分享了不改分享的东西