C语言措施静态库和动态库的建设及其应用
副标题#e#
在用c写措施时,许多时候需要存储一些简朴的数据,假如为此而用mysql数据库就有些大才小用了,可以把这些数据以布局的形写入文件,然后再需要时读取文件,取出数据。
如下是界说函数的源文件和头文件:
源文件struct.c:
#include "struct.h"
//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区巨细,
第四个参数是打开文件流的形态,返回TRUE暗示写入乐成,返回FALSE暗示写入失败
int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode){
int ret;
FILE *fileID = NULL;
fileID = fopen(fileName,mode);
if (fileID == NULL){
perror("fopen");
goto writeEnd;
}
rewind(fileID);
ret = fwrite(buffer,bufferLen,1,fileID);
if (ret <= 0){
perror("fwrite");
goto writeEnd;
}
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return TRUE;
writeEnd:
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return FALSE;
}
//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区巨细,第四个参数是打开文件流的形态,返回TRUE暗示读取乐成,返回FALSE暗示读取失败
int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode){
int ret;
FILE *fileID = NULL;
fileID = fopen(fileName,mode);
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;
}
return TRUE;
readEnd:
if (fileID != NULL){
fclose(fileID);
fileID = NULL;
}
return FALSE;
}
#p#副标题#e#
头文件struct.h:
#ifndef OWNSTRUCT_H_
#define OWNSTRUCT_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区巨细,
第四个参数是打开文件流的形态,返回TRUE暗示写入乐成,返回FALSE暗示写入失败
int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode);
//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区巨细,
第四个参数是打开文件流的形态,返回TRUE暗示读取乐成,返回FALSE暗示读取失败
int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode);
#endif
为了利用利便,可以把这两个函数接口界说为动态链接库或静态链接库。用动态链接库编译生成的可执行文件需挪用.so文件方可正常运行,机动但稍显贫苦;用静态链接库编译生成的可执行文件可直接运行,不消再挪用如.so般的依赖库文件,简朴但不机动。
静态链接库:
1、编译生成方针文件
gcc -c struct.c
2、建设静态库
ar cqs libstruct.a struct.o (顺序不能乱)
3、链接静态链接库,生成可执行文件
gcc main.c -static -L. -ltest -o main
动态链接库:
1、编译成动态链接库
gcc struct.c -fPIC -shared -o libstruct.so
2、链接动态链接库,生成可执行文件
gcc main.c -L. -lstruct -o main
3、配置库文件的情况路径
1)在bashrc或profile文件里用LD_LIBRARY_PATH界说,然后用source加载。
2)把库路径添加到ld.so.conf文件中,然后用ldconfig加载。
3)ldconfig /home/user/lib,仅能临时性利用,若下次ldconfig时此目次下的动态链接库就不能被共享了。
gcc一些参数理会
-shared:指定生成动态链接库。
-static:指定生成静态链接库。
-fPIC:暗示编译为位置独立的代码,用于编译共享库。方针文件需要建设成位置无关码,观念上就是在可执行措施装载它们的时候,它们可以放在可执行措施的内存里的任那里所。
-L.:暗示要毗连的库在当前目次中。
-l:指定链接时需要的动态库。编译器查找动态毗连库时有隐含的定名法则,即在给出的名字前面加上lib,后头加上.so来确定库的名称。
-Wall:生成所有告诫信息。
-ggdb:此选项将尽大概的生成gdb的可以利用的调试信息。
-g:编译器在编译的时候发生调试信息。
-c:只激活预处理惩罚、编译和汇编,也就是把措施做成方针文件(.o文件)。
-Wl,options:把参数(options)通报给链接器ld。假如options中间有逗号,就将options分成多个选项,然后通报给链接措施。