0

0

C++怎么在运行时加载动态库_C++动态库加载与符号解析方法

下次还敢

下次还敢

发布时间:2025-10-24 19:14:01

|

753人浏览过

|

来源于php中文网

原创

答案:C++中可通过平台特定API实现动态库加载,Windows使用LoadLibrary和GetProcAddress,Linux使用dlopen和dlsym,配合跨平台封装与extern "C"避免名称修饰,确保符号正确解析并及时释放资源。

c++怎么在运行时加载动态库_c++动态库加载与符号解析方法

在C++中运行时加载动态库(也叫共享库)是一种常见的需求,尤其适用于插件系统、模块化设计或需要热更新功能的程序。不同操作系统提供了各自的API来实现动态库的加载和符号解析。本文介绍如何在Windows和Linux下使用标准方法完成这一过程。

Windows下使用LoadLibrary加载动态库

在Windows平台,C++可以通过LoadLibraryLoadLibraryEx函数加载DLL文件,再用GetProcAddress获取函数指针。

基本步骤:

  • 调用LoadLibrary("xxx.dll")加载库,返回HMODULE句柄
  • 使用GetProcAddress(hModule, "function_name")获取函数地址
  • 将返回的指针转换为对应函数类型后调用
  • 使用完毕后调用FreeLibrary(hModule)释放库

示例代码:

arXiv Xplorer
arXiv Xplorer

ArXiv 语义搜索引擎,帮您快速轻松的查找,保存和下载arXiv文章。

下载

立即学习C++免费学习笔记(深入)”;

// 假设DLL导出函数 int add(int a, int b)
HMODULE hDll = LoadLibrary(L"mylib.dll");
if (hDll) {
    typedef int (*AddFunc)(int, int);
    AddFunc add = (AddFunc)GetProcAddress(hDll, "add");
    if (add) {
        int result = add(2, 3); // 调用动态库函数
    }
    FreeLibrary(hDll);
}

Linux下使用dlopen加载共享库

在Linux或类Unix系统中,使用dlopendlsymdlclose进行动态库操作。需包含头文件,并链接-ldl库。

基本流程:

  • 调用dlopen("libxxx.so", flag)加载.so文件,返回void*句柄
  • 使用dlsym(handle, "symbol_name")查找符号
  • 将结果转换为函数指针或变量指针使用
  • 调用dlclose(handle)卸载库

示例代码:

立即学习C++免费学习笔记(深入)”;

#include
void* handle = dlopen("./libmylib.so", RTLD_LAZY);
if (!handle) {
    // 处理错误,dlerror()可获取错误信息
}
typedef int (*AddFunc)(int, int);
AddFunc add = (AddFunc)dlsym(handle, "add");
if (!add) {
    // 符号未找到
} else {
    int result = add(4, 5);
}
dlclose(handle);

跨平台封装建议

为了便于跨平台使用,可以封装一个统一接口,根据编译平台选择不同的实现。

#ifdef _WIN32
    #include windows.h>
    using LibHandle = HMODULE;
    LibHandle load_lib(const char* path) { return LoadLibraryA(path); }
    void* get_symbol(LibHandle h, const char* name) { return GetProcAddress(h, name); }
    void close_lib(LibHandle h) { FreeLibrary(h); }
#else
    #include
    using LibHandle = void*;
    LibHandle load_lib(const char* path) { return dlopen(path, RTLD_LAZY); }
    void* get_symbol(LibHandle h, const char* name) { return dlsym(h, name); }
    void close_lib(LibHandle h) { dlclose(h); }
#endif

这样上层代码只需调用load_libget_symbol等函数,无需关心平台差异。

符号解析与类型安全

动态加载的关键在于正确解析符号。C++存在函数名修饰(name mangling),直接按函数名查找可能失败。解决方法

  • 在C++动态库中使用extern "C"声明导出函数,避免名称修饰
  • 例如:extern "C" int add(int a, int b);
  • 这样在GetProcAddressdlsym中可用"add"准确查找

对于类或模板等复杂结构,通常不建议直接通过符号加载,更适合使用接口抽象+工厂模式的方式暴露功能。

基本上就这些。只要注意平台差异、符号命名和资源释放,C++运行时加载动态库并不复杂,但容易忽略错误检查和类型匹配问题。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

95

2023.09.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.8万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号