c 语言动态库,c语言动态库和静态库

kodinid 13 0

大家好,今天小编关注到一个意思的话题,就是关于c 语言动态库的问题,于是小编就整理了4个相关介绍c 语言动态库的解答,让我们一起看看吧。

  1. C中如何调用动态链接库DLL?
  2. c语言如何生成库文件?
  3. linuxc编程调用系统的动态库时,要使用dlopen等函数吗?
  4. c语言如何实现动态替换动态库so文件后,主程序自动加载更新?

C中如何调用动态链接库dll

(1)编写程序时,你要包含(#include "什么.h") dll文件作者提供 的 头文件(.***件) 。程序里,便和普通函数调用一样,去调用它的函数。

(2)程序编译时,你要链接 dll文件作者提供 的 (.lib文件) 库文件。当然,你可以源程序里把.lib 名字 写上,编译时自动去链接,例子:#pragma comment (lib, "什么.lib"

c 语言动态库,c语言动态库和静态库-第1张图片-安济编程网
图片来源网络,侵删)

)(3)执行时,要有 .dll 文件. 放在当前文件夹系统文件夹里。

c语言如何生成库文件?

这里以VC6.0开发工具来做说明,首先创建一个新的工程,工程类型选择DLL(动态)类型,这时工具会自动为你创建一个.c和一个.***件,可以根据自己的实际需要在.c和.***件中加入代码,编译后就会生成和工程同名的动态库文件和静态库文件。

如果没有设置修改,以Debug方式编译,生成的库文件都存放在./Debug目录下,如果在Release方式编译,生成的库文件都存放在./Relese目录下。

c 语言动态库,c语言动态库和静态库-第2张图片-安济编程网
(图片来源网络,侵删)

linuxc编程调用系统的动态库时,要使用dlopen等函数吗?

Linux调用库的方式有三种:

1.静态链接库

2.动态链接库

c 语言动态库,c语言动态库和静态库-第3张图片-安济编程网
(图片来源网络,侵删)

3.动态加载

其中1,2都是在编程时直接调用,在链接时加参数-l进行链接

第三种需要在编程时使用dlopen等函数来获取库里面函数的定义,然后进行调用.

不过对于没有提供头文件的动态库,只能dlopen等函数来调用

c语言如何实现动态替换动态库so文件后,主程序自动加载更新?

粗略地看,要实现动态库的热升级,需要注意4个点(以Linux为例,其他系统类似):

  1. so文件不依赖ldd加载(也就是主程序的ELF不要跟so文件动态链接,这一点可以通过修改链接的命令行实现),而是自己在启动时主动调用dlopen/dlclose/g_module_open/g_module_close这类函数加载和卸载so文件。
  2. 主程序使用inotify等监听so文件的修改***。
  3. so文件导出热更新相关的2个操作,比如可以叫做s***e_and_stop,restore_and_resume。
    s***e_and_stop需要把运行时的状态进行序列化,放在内存或者文件固定位置,比如一个文件中,然后停止操作(重点是不要再改状态)。restore_and_resume从这个位置把状态读回来(反序列化),然后继续运行它的功能
  4. 主程序发现so文件改动以后,调用s***e_and_stop,然后unload动态库,然后load新的动态库,然后调用restore_and_resume。根据具体业务不同,这个最好是程序流程中的一个原子操作,比如flush或者suspend一些队列,暂停处理用户输入(主循环暂停,相关worker线程暂停)。

如果你的so库是无状态的就更容易了,可以省去序列化反序列化的过程。但是一定要做好***的同步,主程序不要在卸载和加载的中间状态执行依赖于动态库的操作。

到此,以上就是小编对于c 语言动态库的问题就介绍到这了,希望介绍关于c 语言动态库的4点解答对大家有用。

标签: 动态 文件 调用