在用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;} |
標頭檔struct.h:
#ifndef OWNSTRUCT_H_#define OWNSTRUCT_H_#include#include#include#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分成多個選項,然後傳遞給連結程式。
相關文章】
- C/C++ 編譯器和調試器以及靜態庫、動態庫使用匯總