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

转载 2007年09月19日 19:07:00
#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分成多个选项,然后传递给链接程序。  

相关文章推荐

c语言中静态库动态库的创建与使用

在c程序中存在两种库文件,分别为静态库文件与动态库文件也叫共享库文件,系统的库文件存放路径为 usr/lib目录下: 静态库文件就是一些.o目标文件的集合,以.a结尾。 静态库在程序链接的时候使用,连...

c语言生成静态库.a和动态库.so

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时...

C语言静态库与动态库的区别的深入分析

区别1:在目标文件链接成可执行文件阶段,库函数(库函数本身有一个代码段)链接进可执行文件(代码段)中,占了很大的内存空间。而使用动态库时,只是在链接时做了一个printf的标记,当可执行程序运行时才会...

Linux下C语言动态库与静态库的制作

原文:http://yanghe9012.blog.163.com/blog/static/21398220320137982452330/ 假设在math目录下已编辑好add.c sub.c di...

【C语言】Linux下动态库和静态库详解

一、基本概念1.1什么是库在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的平台不同(主要是编...

深入理解C语言----动态库 & 静态库 & 链接

库是代码共享的主要方式,动态库和静态库的主要区别在于他们链接形式的不同(静态和动态链接),它们都是目标文件的集合,再加上一些索引表项来表征各文件的信息。通常,linux里目标文件是ELF格式,而win...

Linux C语言动态库及静态库

假设在math目录下已编辑好add.c sub.c div.c mul.c func_point.c文件,func_point.c为包含main()的源文件!    动态库的制作:    方法一:...

7_25 C语言 sizeof计算数组大小以及static讲解和静态库动态库

链式访问:函数的返回值作为另一个函数的参数; 头文件定义: #ifndef __ADD_H_ _ #define __ADD_H_ _ /*``````*/ #endif   外部链接属...

Linux C语言动态库及静态库的制作步骤讲解

Linux C语言动态库及静态库的制作讲解    假设在math目录下已编辑好add.c sub.c div.c mul.c func_point.c文件,func_point.c为主文件!   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言程序静态库和动态库的创建及其应用
举报原因:
原因补充:

(最多只允许输入30个字)