C语言措施静态库和动态库的建设及其应用
当前位置:以往代写 > C/C++ 教程 >C语言措施静态库和动态库的建设及其应用
2019-06-13

C语言措施静态库和动态库的建设及其应用

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分成多个选项,然后通报给链接措施。

    关键字:

在线提交作业