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仍然会照常运行。这说明静态库中的公用函数已经连接到目标文件中了。
- Linux下静态库
- linux sqlite 静态库
- linux静态库
- Linux静态库
- Linux创建静态库
- Linux静态库
- linux-静态链接库
- Linux使用静态库
- #linux 打包 静态库
- Linux 动态/静态库
- linux下静态库
- 使用Linux静态库
- linux静态库制作
- linux 打包 静态库
- 编写linux静态库
- 【linux】 静态库编译
- linux 静态库,makefile
- Linux之静态库
- python与oracle(三)数据类型
- tomcat 配置ORACLE XE数据库连接池
- Proteus和Keil的使用与联调
- 交叉编译tslib1.4
- http post 协议 向服务器提交图片
- linux静态库
- 短线合并
- iPhone HTTP Streaming with FFMpeg and an Open Source Segmenter
- 对比SQL SERVER,ORACLE,DB2上的索引建立语句!
- 脚本AI与脚本引擎
- jQuery之表常用操作
- tslib1.3触摸屏使用过程
- iPhone单例实现,避免内存泄漏
- css import与link的区别