目录 Step#1 创建MFC应用程序,名称TestDll,基于对话框的,最后点击Finish 第一个错误 error C2664 cannot convert argument 1 from 'const char [7]' to 'const wchar_t *' 第二个错误 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. 第三个错误 error LNK2019: unresolved external symbol 第四个错误error LNK1104: cannot open file 'MyDll0.lib' 第五个错误 error LNK2019: unresolved external symbol __imp__add referenced in function 第六个错误 找不到MyDll0.dll,无法继续执行代码。重新安装程序可能会解决此问题 Step#4添加代码之第二种方法【推荐使用此种,实际工程中应用的比较多】 错误及解决办法error LNK2019: unresolved external symbol _add referenced in function Step#1. 新建C#项目,Windows Forms Application,取名CSharpTestDll Step#3双击Add按钮添加事件响应函数,Subtract按钮也要双击 Step#4. 将被使用到的MyDll0.dll放置在'项目的Output Path'目录下。 MFC应用程序使用DLLStep#1 创建MFC应用程序,名称TestDll,基于对话框的,最后点击FinishStep#2 添加两个按钮Add和Subtract这里使用的dll为《创建动态链接库(dll)》中创建的MyDll0.dll
Step#3双击Add按钮添加命令响应函数Step#4添加代码
Step#5错误及解决办法第一个错误 error C2664 cannot convert argument 1 from 'const char [7]' to 'const wchar_t *'错误说明:error C2664: 'void ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Format(UINT,...)' : cannot convert argument 1 from 'const char [7]' to 'const wchar_t *' 解决办法:VS2013默认使用UNICODE编码,将其修改为Not Set Project -> Properties -> Configuration Properties -> General -> Character Set: Not Set 第二个错误 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated.错误说明:error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information. 解决办法: 去微软网站下载这个组件就行了,网址http://go.microsoft.com/fwlink/p/?LinkId=286820 Multibyte MFC Library for Visual Studio 2013 【注意】根据自己的VS版本来选择组件,笔者的是VS2013 参考文章https://blog.csdn.net/tahelin/article/details/30312881 第三个错误 error LNK2019: unresolved external symbol错误说明:error LNK2019: unresolved external symbol __imp__add@8 referenced in function 'public: void __thiscall CTestDllDlg::OnBnClickedBtnAdd(void)' (?OnBnClickedBtnAdd@CTestDllDlg@@QAEXXZ) error LNK2019: unresolved external symbol 'int __cdecl add(int,int)' (?add@@YAHHH@Z) referenced in function 'public: void __thiscall CTestDllDlg::OnBnClickedBtnAdd(void)' (?OnBnClickedBtnAdd@CTestDllDlg@@QAEXXZ) error LNK2019: unresolved external symbol 'int __cdecl subtract(int,int)' (?subtract@@YAHHH@Z) referenced in function 'public: void __thiscall CTestDllDlg::OnBnClickedBtnSubtract(void)' (?OnBnClickedBtnSubtract@CTestDllDlg@@QAEXXZ) error LNK1120: 2 unresolved externals 解决办法:这几个错误是链接(Link)时发生的,因为链接器需要知道这两个函数在哪个地方实现的,所以报错。 1. 将MyDll0.lib放置在TestDll.exe生成目录中,笔者的项目中为Debug目录,如下图 2. 按照下图添加Additional Dependecies附加依赖项 第四个错误error LNK1104: cannot open file 'MyDll0.lib'解决办法: 这是因为没有告诉链接器(LINK)去哪里找这个MyDll0.lib VC++ Directories -> Library Directories(附加库目录) 填入MyDll0.lib所在的目录 绝对路径F:\Code\VS_C++\TestDll\Debug 相对路径..\Debug【两个点代表上层目录】 在笔者的项目中,当前目录是TestDll.sln所在的目录 至此已经可以Build&Link成功,并生成了TestDll.exe,如下图: 第五个错误 error LNK2019: unresolved external symbol __imp__add referenced in function错误说明:error LNK2019: unresolved external symbol __imp__add referenced in function 'public: void __thiscall CTestDllDlg::OnBnClickedBtnAdd(void)' (?OnBnClickedBtnAdd@CTestDllDlg@@QAEXXZ) 【重点】解决办法:要看导出函数声明与导入函数声明是否一致 本例中,查看MyDll0.h中的函数声明是否与使用者TestDllDlg.cpp中的函数声明是否一致 错误例子: MyDll0.h中的声明为 extern 'C' _declspec(dllexport) int _stdcall add(int a, int b); TestDllDlg.cpp中的声明为 extern 'C' _declspec(dllimport) int add(int a, int b);【缺少_stdcall,所以错误】 正确例子: MyDll0.h中的声明为 extern 'C' _declspec(dllexport) int _stdcall add(int a, int b); TestDllDlg.cpp中的声明为 extern 'C' _declspec(dllimport) int _stdcall add(int a, int b); 第六个错误 找不到MyDll0.dll,无法继续执行代码。重新安装程序可能会解决此问题解决办法:将MyDll0.dll放置在TestDll.exe的同层目录下(最终打包给别人的就是这样的目录结构),如下图: Step#6程序运行结果Step#4添加代码之第二种方法【推荐使用此种,实际工程中应用的比较多】TestDllDlg.cpp代码只需要加上一句#include 'MyDll0.h'
MyDll0.h代码 具体可以参考《创建动态链接库(dll)》
错误及解决办法error LNK2019: unresolved external symbol _add referenced in function错误说明:error LNK2019: unresolved external symbol _add referenced in function 'public: void __thiscall CTestDllDlg::OnBnClickedBtnAdd(void)' (?OnBnClickedBtnAdd@CTestDllDlg@@QAEXXZ) 解决办法:先把用到的头文件复制到调用者的目录下,然后配置包含目录 1. 复制MyDll0.h到TestDll.h/TestDll.cpp, TestDllDlg.h/TestDllDlg.cpp同层目录下 2. 配置包含目录:VC++ Directories -> Include Directories(包含目录) 不会用相对路径的朋友就填绝对路径:F:\Code\VS_C++\TestDll\TestDll 相对路径..\TestDll【两个点代表上层目录】 在笔者的项目中,当前目录是TestDll.sln所在的目录 汇总C/C++使用 DLL步骤1. 导入函数声明 Dll的使用者(调用者、客户端)需要将导入函数声明为extern或_declspec(dllimport) 并配置包含目录:VC++ Directories -> Include Directories(包含目录)【头文件目录】 【建议使用相对路径】 2. 添加库文件: 将MyDll.lib放置在TestDll.exe的同层目录下【建议使用相对路径】 并配置附加库目录:VC++ Directories -> Library Directories(附加库目录) 3. 将被用到的.dll放置在使用者(.exe)能找到的目录下 可以参考文章《动态链接库加载的两种方式》中的“四大路径及顺序” 【注意事项】如果xxx.dll有任何更新(xxx.h/xxx.cpp),需要将更新&build后的xxx.h/xxx.lib/xxx.dll提供给使用者(客户端)。 C#应用程序使用DLL与C/C++使用DLL相比要方便多。 Step#1. 新建C#项目,Windows Forms Application,取名CSharpTestDllStep#2 添加两个按钮Add和Subtract
|
|
来自: 老来乐65 > 《“5”DLL(动态连接库)文件》