4221学习网
首页 | 网址大全 | 脑力倍增 | 电脑学院 | 学习方法 | 口才交际 | 英语学习 | 工作职场 | 成功励志 | 文学小说 | QQ·技巧 | 视频短片 | 视频教程 | NBA | 图片 | 游戏技巧 | 恋爱技巧 | 专题教程 | 4221论坛
热门关键字: 视频教程  美女  百家讲坛  记忆力  疯狂英语
 → 当前位置:4221学习网>电脑学院>编程开发>C语言>正文

C语言程序静态库和动态库的创建及其应用

4221学习网 2007-09-26 来源:互联网 收藏本文

在用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<stdio.h>
#include<string.h>
#include<stdlib.h>

#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分成多个选项,然后传递给链接程序。

上一篇:Linux操作系统下C开发环境的构成与安装   下一篇:链表的c语言实现(十)
添加到google书签 digg this! 添加到bolaa 添加到yahoo+ 添加到新浪vivi 添加到365key  
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·Linux操作系统下C开发环境的构成与安装
·链表的c语言实现(十)
·链表的c语言实现(九)
·链表的c语言实现(八)
·链表的c语言实现(七)
·链表的c语言实现(六)
·链表的c语言实现(五)
·链表的c语言实现(四)
·链表的c语言实现(三)
·单链表的c语言实现(1)
发表评论
要记得去论坛讨论,点击注册新会员) 密码: 匿名评论
评论内容:(请自觉遵守互联网相关政策法规。)
最新文章
·链表的c语言实现(一)
·单链表的c语言实现(1)
·链表的c语言实现(三)
·链表的c语言实现(四)
·链表的c语言实现(五)
·链表的c语言实现(六)
·链表的c语言实现(七)
·链表的c语言实现(八)
·链表的c语言实现(九)
·链表的c语言实现(十)
本类阅读排行榜
·链表的c语言实现(一)
·单链表的c语言实现(1)
·《C语言程序设计》教学的几点体会
·链表的c语言实现(三)
·OpenGL编程轻松入门之背景简介
·链表的c语言实现(六)
·在Visual C#.Net中使用CWGraph控件
·浅议C语言中数组和指针的互操作
·链表的c语言实现(四)
·链表的c语言实现(十)
热点视频教程
视频街舞 舞步 教学
视频李孝利十分钟详细舞蹈教程
视频windowsxp重装系统视频教程
视频美女教你跳舞
视频街舞 舞步 教学2
视频韩国的太空步教程,后滑、侧滑、旋转太空
视频如何安装双操作系统
视频台球教程-基本杆法
视频双截棍视频教程-定式
视频【WindowsXP入门教程】 - 硬盘分区
视频启功书法视频
视频24式太极拳教学---基本动作
视频[百家讲坛]三十六计01_借刀杀人
视频 斯诺克台球竿法-后退球
视频超级全脑速读训练教程

设为首页 - 加入收藏 - 关于我们 - 联系我们 - 友情连接

4221学习网版权所有-鄂ICP备07006816号
已浏览: