• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            C語言程序靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的創(chuàng)建及其應(yīng)用

            在用c寫程序時(shí),很多時(shí)候需要存儲(chǔ)一些簡(jiǎn)單的數(shù)據(jù),如果為此而用mysql數(shù)據(jù)庫(kù)就有些
            大才小用了,可以把這些數(shù)據(jù)以結(jié)構(gòu)的形寫入文件,然后再需要時(shí)讀取文件,取出數(shù)據(jù)。

            如下是定義函數(shù)的源文件和頭文件:

            源文件struct.c:

            #include "struct.h"
            //第一個(gè)參數(shù)是要寫入的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
            第四個(gè)參數(shù)是打開文件流的形態(tài),返回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;
            }
            //第一個(gè)參數(shù)是要讀取的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
            第四個(gè)參數(shù)是打開文件流的形態(tài),返回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<stdio.h>
            #include<string.h>
            #include<stdlib.h>
            #define FALSE 0
            #define TRUE 1
            //第一個(gè)參數(shù)是要寫入的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
            第四個(gè)參數(shù)是打開文件流的形態(tài),返回TRUE表示寫入成功,返回FALSE表示寫入失敗
            int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode);
            //第一個(gè)參數(shù)是要讀取的文件名,第二個(gè)參數(shù)是緩沖區(qū),第三個(gè)參數(shù)是緩沖區(qū)大小,
            第四個(gè)參數(shù)是打開文件流的形態(tài),返回TRUE表示讀取成功,返回FALSE表示讀取失敗
            int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode);
            #endif
            為了使用方便,可以把這兩個(gè)函數(shù)接口定義為動(dòng)態(tài)鏈接庫(kù)或靜態(tài)鏈接庫(kù)。用動(dòng)態(tài)鏈接庫(kù)
            編譯生成的可執(zhí)行文件需調(diào)用.so文件方可正常運(yùn)行,靈活但稍顯麻煩;用靜態(tài)鏈接庫(kù)編
            譯生成的可執(zhí)行文件可直接運(yùn)行,不用再調(diào)用如.so般的依賴庫(kù)文件,簡(jiǎn)單但不靈活。

            靜態(tài)鏈接庫(kù):

            1、編譯生成目標(biāo)文件

            gcc -c struct.c

            2、創(chuàng)建靜態(tài)庫(kù)

            ar cqs libstruct.a struct.o (順序不能亂)

            3、鏈接靜態(tài)鏈接庫(kù),生成可執(zhí)行文件

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

            動(dòng)態(tài)鏈接庫(kù):

            1、編譯成動(dòng)態(tài)鏈接庫(kù)

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

            2、鏈接動(dòng)態(tài)鏈接庫(kù),生成可執(zhí)行文件

            gcc main.c -L. -lstruct -o main

            3、設(shè)置庫(kù)文件的環(huán)境路徑

            1)在bashrc或profile文件里用LD_LIBRARY_PATH定義,然后用source加載。

            2)把庫(kù)路徑添加到ld.so.conf文件中,然后用ldconfig加載。

            3)ldconfig /home/user/lib,僅能暫時(shí)性使用,若下次ldconfig時(shí)此目錄下的動(dòng)態(tài)鏈
            接庫(kù)就不能被共享了。

            gcc一些參數(shù)解析

            -shared:指定生成動(dòng)態(tài)鏈接庫(kù)。

            -static:指定生成靜態(tài)鏈接庫(kù)。

            -fPIC:表示編譯為位置獨(dú)立的代碼,用于編譯共享庫(kù)。目標(biāo)文件需要?jiǎng)?chuàng)建成位置無關(guān)
            碼,概念上就是在可執(zhí)行程序裝載它們的時(shí)候,它們可以放在可執(zhí)行程序的內(nèi)存里的任
            何地方。

            -L.:表示要連接的庫(kù)在當(dāng)前目錄中。

            -l:指定鏈接時(shí)需要的動(dòng)態(tài)庫(kù)。編譯器查找動(dòng)態(tài)連接庫(kù)時(shí)有隱含的命名規(guī)則,即在給出
            的名字前面加上lib,后面加上.so來確定庫(kù)的名稱。

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

            -ggdb:此選項(xiàng)將盡可能的生成gdb的可以使用的調(diào)試信息。

            -g:編譯器在編譯的時(shí)候產(chǎn)生調(diào)試信息。

            -c:只激活預(yù)處理、編譯和匯編,也就是把程序做成目標(biāo)文件(.o文件)。

            -Wl,options:把參數(shù)(options)傳遞給鏈接器ld。如果options中間有逗號(hào),就將
            options分成多個(gè)選項(xiàng),然后傳遞給鏈接程序。

            posted on 2007-09-29 02:14 旅途 閱讀(781) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux開發(fā)

            久久久久女教师免费一区| 国产精品久久久久天天影视 | 国产精品女同久久久久电影院 | 亚洲欧美成人综合久久久| 久久99九九国产免费看小说| 久久国产精品免费一区二区三区| 久久本道综合久久伊人| 久久这里只有精品18| 亚洲欧洲精品成人久久奇米网| 国产69精品久久久久APP下载| 一级做a爰片久久毛片免费陪 | 日韩精品久久久久久久电影蜜臀| 国产精品对白刺激久久久| 久久久久久久国产免费看| 国产亚洲美女精品久久久2020| 97久久精品无码一区二区| 久久久久婷婷| 久久久久久国产精品无码下载| 久久777国产线看观看精品| 无码人妻精品一区二区三区久久久 | 久久无码AV中文出轨人妻| 青青青国产成人久久111网站| 伊人久久大香线蕉综合Av| 综合久久精品色| 久久人人爽人人澡人人高潮AV | 久久国产色AV免费看| 久久夜色精品国产噜噜麻豆 | 久久综合亚洲欧美成人| 久久亚洲私人国产精品vA| 亚洲伊人久久大香线蕉综合图片| 国产69精品久久久久APP下载| 人妻无码精品久久亚瑟影视| 思思久久好好热精品国产| 中文精品久久久久人妻不卡| 久久精品卫校国产小美女| 色妞色综合久久夜夜| 国产亚洲精品久久久久秋霞| 亚洲AV无码久久| 91精品国产91热久久久久福利| 久久久久综合中文字幕| 亚洲AV无码久久精品蜜桃|