C语言程序静态库和动态库的创建及其应用

C语言程序静态库和动态库的创建及其应用,第1张

C语言程序静态库和动态库的创建及其应用,第2张

用C写程序时,经常需要存储一些简单的数据。如果用mysql数据库来做这个,就有些没用了。你可以把这些数据以一个结构的形式写入一个文件,然后在需要的时候读取该文件并取出数据。

下面是定义函数的源文件和头文件:

源文件结构c:

# include " struct . h "
/第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,
第四个参数是打开文件流的形式,返回True表示写入成功,返回TRUE表示写入FALSE
int write struct(const char * filename,char * buffer,int buffer len,char * mode){
int ret;
FILE * fileID = NULL;
fileID = fopen(文件名,模式);
if(fileID = = NULL){
perror(" fopen ");
goto write end;
}
rewind(fileID);
ret = fwrite(buffer,bufferLen,1,fileID);
if(ret perror(" fwrite ");
goto write end;
}
if (fileID!= NULL){
fclose(fileID);
fileID = NULL;
}
返回TRUE
writeEnd:
if (fileID!= NULL){
fclose(fileID);
fileID = NULL;
}
返回FALSE
}
/第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,
第四个参数是打开文件流的形式,返回TRUE表示读取成功,返回FALSE表示读取失败
int read struct(const char * filename,char *)
FILE * fileID = NULL;
fileID = fopen(文件名,模式);
if(fileID = = NULL){
perror(" fopen ");
goto readEnd;
}
rewind(fileID);
memset(buffer,0,sizeof(buffer));
ret = fread(buffer,bufferLen,1,fileID);
if(ret > = 0){
strcat(buffer," \ 0 ");
} else {
perror(" fread ");
goto readEnd;
}
if (fileID!= NULL){
fclose(fileID);
fileID = NULL;
}
返回TRUE
readEnd:
if (fileID!= NULL){
fclose(fileID);
fileID = NULL;
}
返回FALSE
}


头文件结构. h:

# ifndef own struct _ H _
# define own struct _ H _
# include
# include
# define FALSE 0
# define TRUE 1
//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,
第四个参数是打开文件流的形式,返回TRUE表示写入成功,返回FALSE表示
//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区的大小,
第四个参数是打开文件流的形式。如果返回TRUE,则读取成功,如果返回FALSE,则读取失败
int read struct(const char * filename,char * buffer,int buffer len,。
#endif

为了方便起见,这两个函数接口可以定义为动态链接库或者静态链接库。用动态链接库编译的可执行文件需要调用。这样文件才能正常运行,这是灵活的,但略显麻烦;用静态链接库编译的可执行文件可以直接运行,不需要像。这很简单但是不灵活。


静态链接库:


1。编译并生成目标文件。

gcc -c结构

2.创建静态库

Ar cqs libstruct.a struct.o(顺序不能乱序)

3.链接静态链接库生成可执行文件。

gcc main . c-static-l .-ltest-o main


动态链接库:

1.编译成动态链接库。

gcc struct . c-fPIC-shared-o lib struct . so

2.链接动态链接库生成可执行文件。

gcc总管。c-l-l结构-o总管

3.设置库文件的环境路径。

1)用LD_LIBRARY_PATH在bashrc或profile文件中定义,然后用source加载。

2)在ld.so.conf文件中添加库路径,然后用ldconfig加载。

3)ldconfig /home/user/lib,只能临时使用。如果下一个ldconfig,这个目录下的动态链接库将不会被共享。


一些GCC参数的分析

-shared:指定生成动态链接库。

-static:指定生成静态链接库。

-fPIC:表示编译成与位置无关的代码,用于编译共享库。对象需要被创建为独立于位置的代码。从概念上讲,当可执行程序加载它们时,它们可以放在可执行程序内存中的任何地方。

-L .:表示要连接的库在当前目录中。

-l:指定链接时所需的动态库。编译器在寻找动态链接库时有一个隐式的命名规则,即在给定的名称和之前添加lib。所以在它确定了图书馆的名称之后。

-Wall:生成所有警告消息。

-ggdb:该选项将尽可能多地生成gdb的可用调试信息。

-g:编译器在编译时生成调试信息。

-c:只激活预处理、编译和汇编,即把程序做成一个目标文件(。o文件)。

-Wl,options:将参数(选项)传递给链接器ld。如果选项中间有逗号,就把选项分成多个选项,传递给链接器。


位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C语言程序静态库和动态库的创建及其应用

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情