C語言程式靜態庫和動態庫的建立及其應用

來源:互聯網
上載者:User

在用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/C++ 編譯器和調試器以及靜態庫、動態庫使用匯總

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.