哈喽,各位好!今天咱们聊聊C++里一个相当酷炫,但又稍微有点“野”的特性:动态加载共享库和运行时符号解析,也就是 dlopen 和 dlsym。 一、什么是动态加载?为什么要用它? 想象一下,你正在开发一个图像处理软件。这软件功能很多,比如有模糊、锐化、色彩调整等等。 如果把所有功能都编译进一个巨大的可执行文件,那会怎么样? 体积庞大: 即使你只用到了模糊功能,其他锐化和色彩调整的代码也得跟着你一起“旅行”,浪费磁盘空间。 编译缓慢: 每次修改一个小的功能,都要重新编译整个程序,耗时耗力。 扩展困难: 如果你想添加一个新的滤镜,必须重新编译整个程序,然后重新发布。 这时候,动态加载就派上用场了! 它可以让你把一些功能模块(比如模糊、锐化)编译成独立的共享库(.so 文件在 Linux/Unix 系统中,.dll 文件在 Windows 系统中)。只有在程序运行的时候,需要某个功能时,才动态地加载相应的共享库,并使用其中的函数。 动态加载的优点: 优点 解释 模块化 将程序分解成独立的模块,每个模块负责特定的功能。 减小体积 只有在需要时才加载模块,减小了程序的初始体积。 快速编译 修改 …
C++ 动态库加载与卸载:`dlopen`/`LoadLibrary` 的跨平台实践
好的,各位观众老爷们,掌声在哪里!今天咱们来聊聊C++动态库加载与卸载,也就是dlopen/LoadLibrary 这对好基友的跨平台故事。 前言:动态库是个啥玩意儿? 话说,程序员的世界里,代码就像一堆乐高积木,可以拼成各种各样的城堡。但有些城堡特别复杂,一次性拼完累死个人。于是,聪明的人们发明了动态库,也就是把城堡的一部分拆出来,需要的时候再拼上去。 动态库(Dynamic Library),也叫共享库(Shared Library),就是把一些常用的函数、类啥的打包在一起,等到程序运行的时候才加载。这样有啥好处呢? 节省空间: 多个程序可以共享同一个动态库,不用每个程序都存一份,省硬盘啊! 方便更新: 动态库更新了,只需要替换一下动态库文件,不用重新编译整个程序。想想看,如果微信更新一个表情包就要你重新安装整个APP,你受得了么? 模块化: 可以把程序拆成一个个模块,每个模块对应一个动态库,方便维护和扩展。 主角登场:dlopen/LoadLibrary 现在,咱们的主角就要闪亮登场了。dlopen和LoadLibrary,它们就是负责把动态库这块乐高积木拼接到程序城堡上的工具。 …