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语言静态库与动态库的区别的深入分析

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

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

在用c写程序时,很多时候需要存储一些简单的数据,如果为此而用mysql数据库就有些大才小用了,可以把这些数据以结构的形写入文件,然后再需要时读取文件,取出数据。如下是定义函数的源文件和头文件:源文件s...
  • taolinke
  • taolinke
  • 2009年09月11日 11:32
  • 494

c语言------静态库和动态库的创建和使用

一.  静态库       1. 静态库的创建           gcc  -c  源文件 . c                                 //为了得到源文件的 . o ...
  • zer1123
  • zer1123
  • 2017年01月18日 20:44
  • 238

C++静态库与动态库的区别?

C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐...
  • sinat_20265495
  • sinat_20265495
  • 2016年09月11日 10:37
  • 2702

linux下生成静态库和动态库

linux下生成静态库和动态库 一、动态库、静态库简介 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质...
  • Ddreaming
  • Ddreaming
  • 2016年11月09日 22:25
  • 1557

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

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

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

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

静态库链接动态库时,如何使用该静态库

假设libXXX.a用了libpthread.so的函数“pthread_create”,那libXXX.a在链接时,有没有把“pthread_create”函数copy到自己身上,使其完全独立?ma...
  • newchenxf
  • newchenxf
  • 2016年06月22日 18:23
  • 5615

创建和使用库,包括静态库和动态库(共享库)

在Linux下进行C/C++开发经常要创建和使用库,包括静态库和动态库(共享库)。 静态库文件的扩展名是.a,其命名规则是libxxx.a, 动态库的扩展名是.so,其命名规则是libxxx.so...
  • u010193457
  • u010193457
  • 2015年06月04日 10:52
  • 1286

VS2015静态库与动态库的使用

VS2015静态库与动态库的使用静态库 静态库创建(略),往往我们使用第三方的比较常见,如果要自己团队间创建使用也很简单; 头文件的加载: 方式一: (1)将静态库给出的头文件拷贝到项目目录下(*...
  • cppnewlearner
  • cppnewlearner
  • 2017年09月30日 14:50
  • 388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言程序静态库和动态库的创建及其应用
举报原因:
原因补充:

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