Linux系统下静态库的生成和使用

  一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。通由一组相互关联的函数组成以执行某项常见的任务。

二、库文件的名字命名规范:

  以lib开头,随后的部分指明是什么库(c代表C语言库,m代表数学库)。文件名的最后部分以.开始,最后给出库文件的类型。

.a代表传统的静态函数库;    .so代表共享函数库。

三、静态库

  函数库最简单的形式是一组处于“准备好使用”状态的目标文件。当程序需要使用函数库中的某个函数时,它包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库结合在一起以组成一个单独的可执行文件。使用 -l选项指明除标准C语言运行库外还需要使用的库。

静态库也称为归档文件(archive),按惯例其文件名都以.a结尾。比如C语言标准函数库    /usr/lib/libc.a和X11函数库/usr/lib/libX11.a。

跟我拼读

四、举例

单链表项目的文件结构

AfxStd.h包含内容: 

#ifndef AFXSTD_H
#define AFXSTD_H
#include<stdio.h>
#include<string.h>    //memset
#include<stdlib.h>    //exit
#include<malloc.h>    //malloc free
#include<assert.h>
#endif

LinkList.h包含内容:

#ifndef LINKLIST_H
#define LINKLIST_H

typedef int ElemType;

typedef struct ListNode
{
    ElemType data;
    struct ListNode *next;
}ListNode;

typedef struct SList
{
    ListNode head;
    int cursize;
}SList;

ListNode *BuyNode();
void InitList(SList *plist);    //初始化
void FreeNode(ListNode *pnode);    //释放某个节点
void InsertList(SList *plist, int pos, ElemType kx);    //按位置进行插入
void PushFront(SList *plist, ElemType kx);    //头插
void PushBack(SList *plist, ElemType kx);    //尾插
void PrintList(SList *plist);    //打印输出
#endif

AfxStd.c包含内容:

#include"../include/AfxStd.h" 
单链表

 LinkList.c包含内容:

#include"../include/AfxStd.h"
#include"../include/LinkList.h"
ListNode *BuyNode()
{
    ListNode *s = (ListNode *)malloc(sizeof(ListNode));
    if(s == NULL)
    {
        exit(1);
    }
    memset(s, 0, sizeof(ListNode));
}

void InitList(SList *plist)
{
    assert(plist != NULL);
    plist->head.next = NULL;
    plist->cursize = 0;
}

void FreeNode(ListNode *pnode)
{
    if(pnode == NULL)
    {
        return;
    }
    free(pnode);
}


void InsertList(SList *plist, int pos, ElemType kx)
{
    assert(plist != NULL);
    int i = 0;
    if(pos < 1 || pos > plist->cursize+1)
    {
        return;
    }
    ListNode *p = &(plist->head);
    for(i=0;  i < pos-1; ++i)
    {
        p = p->next;
    }  
    ListNode *q = BuyNode();
    q->data = kx;
    q->next = p->next;
    p->next = q;
    plist->cursize += 1;
}

void PushFront(SList *plist, ElemType kx)
{
    InsertList(plist, 1, kx);
}

void PushBack(SList *plist, ElemType kx)
{
    InsertList(plist, plist->cursize+1, kx);
}

void PrintList(SList *plist)
{
    assert(plist != NULL);
    ListNode *q  = plist->head.next;
    while(q != NULL)
    {
        printf("%5d", q->data);
        q = q->next;
    }
    printf("\n");
}

main.c包含内容:

#include"../include/AfxStd.h"
#include"../include/LinkList.h"
int main()
{
    int i;
    SList mylist;
    int ar[] = {12, 23, 34, 45, 56, 67, 78, 89, 90, 100};
    int n = sizeof(ar)/sizeof(ar[0]);
    InitList(&mylist);
    for( i=0; i<n; ++i)
    {
        InsertList(&mylist, i, ar[i]);
    }
    PrintList(&mylist);
    return 0;
}

最后一步:

运行结果

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/81150284