linux静态库

来源:互联网 发布:网络主播面试自我介绍 编辑:程序博客网 时间:2024/04/29 09:22

静态库的程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

一、将以前的两个文件改为三个文件:test2.h,test2.c ,main.c。

test2.h为函数库的头文件:

typedef struct{ char setDate[11];/*会计日期*/ char operNo[9];/*柜员号*/ long seqno;/*流水号*/ char transcode[7];/*交易码*/ char acctNo[33];/*账号*/ char oppacctNo[33];/*对方账号*/ char abs[11];/*摘要*/}STRU_SAVJ;/*文件的最大行数为999*/#define MAXLEN 999/*将文件的每行内容读到结构体里*/int read( STRU_SAVJ* S_savj );/*将结构体排序*/int sort( STRU_SAVJ* S_savj , int size ,STRU_SAVJ* S_sort[] );/*比较两个结构体*/int compare( STRU_SAVJ* S_a , STRU_SAVJ* S_b);/*将结构体的内容写到文件里*/int write( STRU_SAVJ* S_sort[] , int size );/*从str里读取第seq个域的值放到value里*/int getField( char *str, int seq ,char *value);

test2.c是函数库的头文件:

#include "test2.h"#include <stdio.h>/*read()函数读取文件内容到结构体,如果执行成功,返回读取的数据行数,失败返回-1*/int read( STRU_SAVJ* S_sav){        FILE * stream ;        char buf[100];/*用来保存读取的数据的缓冲区*/        int count=0;/*记录当前行数*/        int len =0;/*用来记录当前buf的长度*/        char tmp[20];        memset(buf,0,sizeof(buf));        memset(tmp,0,sizeof(tmp));        stream = fopen("savj_atomjour.txt","rt");        if(stream==NULL){                printf("open file failed\n");                return -1;        }/*fgets()函数每次从文件里读取一行数据或98个字符到buf字符串中,成功返回buf,失败返回NULL*/        while(fgets(buf,99,stream)){/*如果当前行数大于规定行数,关闭文件,函数返回*/                if(count > MAXLEN-1){                        printf("Too long!\n");                        fclose(stream);                        return -1;                }/*buf的长度*/                len= strlen(buf);/*将换行符‘\n'换成NULL*/                if(buf[len-1] == '\n'){                        buf[len-1]=0;                }/*将buf里的数据存放到结构体里*/                getField(buf,0,S_sav[count].setDate);                getField(buf,1,S_sav[count].operNo);                getField(buf,2,tmp);                S_sav[count].seqno=atol(tmp);                getField(buf,3,S_sav[count].transcode);                getField(buf,4,S_sav[count].acctNo);                getField(buf,5,S_sav[count].oppacctNo);                getField(buf,6,S_sav[count].abs);                count++;/*执行完后,当前行数+1*//*将buf缓冲区里的内容置0*/                memset(buf,0,sizeof(buf));        }        fclose(stream);/*返回读取数据的行数*/        return count;}/*将结构体数组里的内容写到目标文件里*/

int write( STRU_SAVJ * S_sort[],int size){        int count=0;                FILE* fsetDate;                if((fsetDate=fopen("setDate.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;                }

                FILE* foperNo;                if((foperNo=fopen("operNo.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;                }                FILE* fseqno;                if((fseqno=fopen("seqno.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;                }                FILE* ftranscode;                if((ftranscode=fopen("transcode.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;}                FILE* facctNo;                if((facctNo=fopen("acctNo.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;                }                FILE* foppacctNo;                if((foppacctNo=fopen("oppacctNo.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;                }                FILE* fabs;                if((fabs=fopen("abs.txt","w"))==NULL){                        printf("open file failed!\n");                        return -1;                }        for(;count<size;count++){                fprintf(fsetDate,"%s\n",S_sort[count]->setDate);

                fprintf(foperNo,"%s\n",S_sort[count]->operNo);

                fprintf(fseqno,"%ld\n",S_sort[count]->seqno);                fprintf(ftranscode,"%s\n",S_sort[count]->transcode);

                fprintf(facctNo,"%s\n",S_sort[count]->acctNo);

                fprintf(foppacctNo,"%s\n",S_sort[count]->oppacctNo);

                fprintf(fabs,"%s\n",S_sort[count]->abs);        }                fclose(fsetDate);                fclose(foperNo);                fclose(fseqno);                fclose(ftranscode);                fclose(facctNo);                fclose(foppacctNo);                fclose(fabs);        return 0;

}

 

int sort( STRU_SAVJ* S_savj , int size ,STRU_SAVJ* S_sort[] ){ int i,j; int a; int b=1; STRU_SAVJ* c; for(i=0;i<size;i++){ S_sort[i]=&S_savj[i]; } for(i=0;i<size-1;i++){ if(b!=1){ break; } b=0; for(j=size-1;j>i;j--){ a=compare(S_sort[j],S_sort[j-1]); if(a>0){ c=S_sort[j]; S_sort[j]=S_sort[j-1]; S_sort[j-1]=c; b=1; } } } return 0;}int getField( char* str,int seq,char* value){ int i=0; int len=strlen(str); int j=0; int count=-1; char ch='|'; for(;i<len;i++){ if(str[i]==ch){ count++; if(count==seq){ value[j]=0; break; }else{ memset(value,0,sizeof(value)); j=0; continue; } } value[j]=str[i]; j++; } return 0;}int compare( STRU_SAVJ* S_a , STRU_SAVJ* S_b){ if(strcmp(S_a->setDate,S_b->setDate)==0){ if(strcmp(S_a->operNo,S_b->operNo)==0){ if(S_a->seqno==S_b->seqno){ return 0; }else if(S_a->seqno<S_b->seqno){ return 1; }else{ return -1; } }else if(strcmp(S_a->operNo,S_b->operNo)<0){ return 1; }else{ return -1; } }else if(strcmp(S_a->setDate,S_b->setDate)<0){ return 1; }else{ return -1; }}

main.c为主程序:

#include "test1.h"#include <stdio.h>int main(int argc ,char* argv[]){/*结构体数组,用来存放数据*/        STRU_SAVJ S_sav[MAXLEN];/*结构体指针数组,每个指针都指向一个结构体变量,用来存放排序后的数据*/        STRU_SAVJ *S_sort[MAXLEN];/*用来记录读取的数据行数*/        int size;/*初始化结构体数组*/        memset(S_sav,0,sizeof(S_sav));        memset(S_sort,0,sizeof(S_sort));/*read()函数读取文件内容到结构体,如果执行成功,返回读取的数据行数,失败返回-1*/        size = read(S_sav);        if(size < 0){                printf("read info failed!\n");                exit(1);        }/*sort()函数将结构体排序,如果失败返回-1*/        if(sort(S_sav,size,S_sort)<0){                printf("sort failed!\n");                exit(1);        }/*write()函数将结构体的内容写到文件里,如果失败返回-1*/        if(write(S_sort,size)<0){                printf("write file failed!\n");                exit(1);        }        exit(0);}


二、将test2.c编译成test2.o文件

无论是静态库,还是动态库,都是由.o文件创建的。

cc -c test2.c
这条命令会产生一个test2.o文件。


 三、由test2.o文件创建静态库

静态库文件的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。

如:创建名为test的静态库,则静态库文件名就是libtest.a。

创建静态库时使用ar命令。

ar cr libtest.a test2.o
这条命令会产生一个libtest.a的静态库文件。

四、在程序中使用

用cc命令生成目标文件时指明静态库名,cc将会从静态库中将公用函数连接到目标文件中。

cc -o ok main.c -L. -ltest这条命令将会产生一个叫ok的可执行文件。rm libtest.a如果将libtest.a文件删除,ok仍然会照常运行。这说明静态库中的公用函数已经连接到目标文件中了。


 

原创粉丝点击