linux 编程之库的使用(学习笔记)

本文详细介绍了静态库和动态库的概念及其在Unix环境下的创建与使用方法。包括使用ar命令创建静态库,以及如何通过gcc命令编译生成静态库和动态库。此外,还提供了动态库隐式调用和显式调用的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.库概述

库可以分为静态库和动态库,静态库编译时必须存在,程序运行时不需要。

动态库也称共享库,其代码不会链接到目标文件之中,只有当动态库可访问时,应用程序才能正确地执行动态库函数。执行动态库有两种方式:隐式调用和显示调用。隐式调用也称共享库的静态加载,动态库函数在应用程序开始执行时会自动载入内存,进程结束时又自动卸载。编译方式与静态库一致。显示调用也称共享库的动态加载,调用时必须遵守dlopen等函数的规则实现调用。

 

Unix中,使用ar命令可以创建或操作静态库,其格式为:

ar [drqtpmx] [option] archivefile objfile ….

参数

意义

-r

objfile文件插入静态库尾或替换静态库中同名文件

-x

从静态库文件中抽取文件objfile

-t

打印静态库的成员文件列表

-d

从静态库文件中删除文件objfile

-s

重置静态库文件索引

-v

创建文件冗余信息

-c

创建静态库文件

 

例子:抽取静态库/usr/lib/lic.a中的文件

# ar –x /usr/lib/libc.a

例子:组织文件xcvt.oxstat.o创建静态库libccc.a

# ar –r libccc.a xcvt.o xstat.o

 

2. 静态库编程

2.1 设计库源码

/******pr1.c*****/

void pirnt1()

{

       printf(“this is the first lib src/n”);

}

/*******pr2.c***********/

void print2()

{

       printf(“this is the second lib src/n”);

}

 

2.2. 编译生成库文件

gcc –O –c pr1.c pr2.c

分别产生pr1.o, pr2.o文件

链接静态库

ar –rsv libpr.a pr1.o pr2.o

2.3 测试程序源码

/********main.c************/

int main()

{

       print1();

       print2();

}

2.4 编译运行

gcc –O –o main main.c –L./ -lpr

 

3. 动态库编程

3.1 库源码

/*******pr1.c********/

int p=2;

void print()

{

       printf(“This is the first dll src!/n”);

}

/*******pr2.c*********/

int p = 3;

void print()

{

       printf(“This is the second dll src!/n”);

}

 

3.2 编译生成动态库

gcc –O –fpic –shared –o d1.so pr1.c

gcc –O –fpic –shared –o d2.so pr2.c

 

3.3. 动态库的隐式调用

/*****main.c*****/

int main()

{

       print();

}

cp d1.so dll.so cp d2.so dll.so

编译:gcc –O –o main main.c ./dll.so

 

3.4. 动态库的显式调用

#include <dlfcn.h>

int main()

{

        void *pHandle;//动态库句柄

        void (*pFunc)();//函数指针

        int *p;

        pHandle = dlopen("./dll.so", RTLD_NOW);

        if(!pHandle)

        {

                printf("Cann't find dll.so/n");

                return 1;

        }

        pFunc = (void(*)())dlsym(pHandle, "print");

        if(pFunc)

        {

                pFunc();

        }

        else

        {

                printf("Can't find func print/n");

        }

 

        p = (int *)dlsym(pHandle, "p");

        if(p)

        {

                printf("p=%d/n", *p);

        }

        else

        {

                printf("Can't find int p/n");

        }

        dlclose(pHandle);

 

        return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值