Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LNK2019错误一个DLL链接到MFC DLL_C++_Dll_Mfc_Linker - Fatal编程技术网

C++ LNK2019错误一个DLL链接到MFC DLL

C++ LNK2019错误一个DLL链接到MFC DLL,c++,dll,mfc,linker,C++,Dll,Mfc,Linker,我是MFC的新手 我试图在MFC中创建一个DLL,它链接到另一个DLL 问题是,当我尝试编译时,我得到一个LNK2019错误,该错误是针对我试图链接的DLL中存在的函数抛出的 LNK2019是指未找到DLL或DLL内的函数时 我已经采取了所有步骤,DLL被放置在一个已知的位置,库也被放置在一个已知的位置,它被添加到了附加的依赖项中,所有正确的开关都被应用(我知道的那些) 我使用过Dependency walker,我知道我试图链接的DLL公开了这个函数。 我还有其他使用函数的例子,我正试图像它一

我是MFC的新手

我试图在MFC中创建一个DLL,它链接到另一个DLL

问题是,当我尝试编译时,我得到一个LNK2019错误,该错误是针对我试图链接的DLL中存在的函数抛出的

LNK2019是指未找到DLL或DLL内的函数时

我已经采取了所有步骤,DLL被放置在一个已知的位置,库也被放置在一个已知的位置,它被添加到了附加的依赖项中,所有正确的开关都被应用(我知道的那些)

我使用过Dependency walker,我知道我试图链接的DLL公开了这个函数。 我还有其他使用函数的例子,我正试图像它一样使用它。 .lib和.dll是一致的,即它们彼此一致

但错误依然存在

编辑 这是错误消息:

错误2错误LNK2019:未解析的外部符号 “uuu declspec(dllimport)public:bool\uuuu thiscall” PwServer::Connect(wchar\u t const*、无符号长、无符号长*) ()小鬼?Connect@PwServer@@QAE_NPB_WKPAK@Z)在函数中引用 “public:bool\uu thiscall CPwServer::Connect(类 ATL::CStringT>>,无符号长,无符号长*) (?Connect@CPwServer@@内华达州$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@地图集地图集@@KPAK@Z)

这是我用来访问DLL的调用

bool conn = PwSrv->Connect(_T(""));
函数的Dumpbin导出:

25BE6 ?Connect@PwServer@@QAE_NPBGKPAK@Z 25BE6 __imp_?Connect@PwServer@@QAE_NPBGKPAK@Z
在将MFC DLL与常规DLL链接时,是否还需要添加其他内容,例如添加AFX_EXT_uuu或其他内容

请就此提出建议。 多谢各位

更新

似乎所有需要做的就是将Project Properties>>C/C++>>Language>>中设置的标志切换为NO,将wchar\u t视为内置类型。我以前从未使用过该标志,所以不知道。链接器错误在那里


嗯。现在我有另一个问题。wchar的切换解决了DLL与另一个MFC DLL链接的问题,但现在我的应用程序无法在我的DLL中找到入口点。在dependency walker中,它显示了应用程序正在发送的CString与我的DLL正在接受的未签名Short..之间的不匹配(可能是由于关闭了
wchar\u t
的缘故)

假设您正确地包含了DLL的.lib文件(大多数情况下,这取决于编译器设置的差异,例如UNICODE设置)

  • 通过将“显示进度”链接器设置设置设置为详细,检查.lib是否确实正在加载
  • 在LIB文件上运行DUMPBIN,检查导出的函数是否与链接器尝试导入的函数相同

  • 如果名称修饰略有不同,则会给你一个线索。问题:用PuppBin检查导出函数的实际名称。它是相同的C++修饰和调用风格。当你的DLL不能链接到你的其他DLL的导出库时,MFC不应该在游戏中。你使用的函数声明是什么?为了访问这个DLL,与名称和调用约定一致?例如,在C++中,API名称通常是“代码>外部”C。以避免名称损坏依赖项。在您的问题中,从您的生成日志和DLL的转储文件/导出中发布准确的链接器错误消息内容将非常有帮助。请检查上述问题中的编辑部分。谢谢。一个项目是以UNICODE方式生成的,另一个是以非UNICODE方式生成的吗?您是否维护被调用的DLL项目t代码?如果是,将该项目添加到项目设置>>公共属性>>添加新引用。这是我试图引用的函数的dumpbin导出:

    25BE6?Connect@PwServer@@QAE_NPBGKPAK@Z25BE6\uuuu imp\uu6?Connect@PwServer@@QAE_NPBGKPAK@Z
    。错误如上文主要问题编辑部分所示。A是的,它们有点不同(“QAE_NPBGKPAK”不是“QAE_NPB_WKPAK”)它们都是用同一版本的Visual Studio编译的吗?可能的命名空间问题?似乎这不是问题所在。所需要做的只是切换Properties>>C/C++>>Language>>中设置的标志,将wchat\u t视为内置类型为否。很有趣。我以前从未遇到过此标志。好的。现在我遇到了另一个问题。
    wchar的切换_t
    解决了DLL链接到另一个
    MFC DLL
    的问题,但现在我的应用程序无法在我的DLL中找到入口点。在dependency walker中,它显示了应用程序正在发送的
    CString
    与我的DLL正在接受的未签名Short..之间的不匹配(大概是由于“wchar_t”被关闭了)。每个设置都会影响名称装饰。一旦这些设置匹配,装饰将是相同的,您就可以开始了。
    dumpbin /ALL mylib.lib > exports.txt