错误LNK 2019和LNK2028在一个类中的一个功能,其他工作正常

问题描述:

我通常在C#中工作,并在这个我的智慧。我使用创建动态链接库。错误LNK 2019和LNK2028在一个类中的一个功能,其他工作正常

如下所示

DeveloperConsoleManager.h

#pragma once 
#include "atlstr.h" 

#ifdef DEVCONSOLEMANAGER_EXPORTS 
    #define DEVCONSOLEMANAGER_API __declspec(dllexport) 
#else 
    #define DEVCONSOLEMANAGER_API __declspec(dllimport) 
#endif 

namespace DeveloperConsoleManager 
{  
    class DeveloperConsoleLogic 
    { 
     public: 
      // Returns a + b 
      static DEVCONSOLEMANAGER_API double Add(double a, double b); 
      static DEVCONSOLEMANAGER_API bool CheckforValidFile(CString fileName); 
    }; 
} 

DeveloperConsoleManager.cpp

// DeveloperConsoleManager.cpp : Defines the exported functions for the DLL application. 
// 

#include "stdafx.h" 
#include "DeveloperConsoleManager.h" 

namespace DeveloperConsoleManager 
{ 
    double DeveloperConsoleLogic::Add(double a, double b) 
    { 
     return a + b; 
    } 


    bool DeveloperConsoleLogic :: CheckforValidFile(CString fileName) 
    {  
     return false; 
    } 
} 

我在使用这些方法在一个cpp文件我已经定义两种方法一个不同的项目(类型:应用程序(.exe))。当我生成解决方案,有以下链接错误

警告1个警告C4273: 'DeveloperConsoleManager :: DeveloperConsoleLogic ::添加':不一致的dll链接E:\ md_69 \ developerconsolemanager \ developerconsolemanager.cpp 10

警告2警告C4273: 'DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile':不一致的dll链接E:\ md_69 \ developerconsolemanager \ developerconsolemanager.cpp 16

错误3错误LNK2028:无法解析令牌(0A0004F1)“市民:静态布尔__cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile(ATL :: CStri类在函数“public”中引用了(?CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV?$ CStringT @ _WV?$ StrTraitMFC_DLL @ _WV?$ ChTraitsCRT @ _W @ ATL @@@@@ ATL @@@ Z) :无效__thiscall CSaSsiConsoleUi :: UploadSsiCheck(无效) “(?UploadSsiCheck @ CSaSsiConsoleUi @@ $$ FQAEXXZ)E:\ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

错误4错误LNK2019:无法解析的外部符号” 公用:静态布尔__cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile(class ATL :: CStringT >>)“(?CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV?$ CStringT @ _WV?$ StrTraitMFC_DLL @ _WV?$ ChTraitsCRT @ _W @ ATL @@@@ (?)UploadSsiCheck(CSASsiConsoleUi @@ $$ FQAEXXZ)E:\ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

函数“public:void __thiscall CSaSsiConsoleUi :: UploadSsiCheck(void)”中引用的@ ATL @

错误5错误LNK1120:2解析的外部E:\ MD_69 \调试\ DeveloperConsoleUi.exe

没有为 “添加” 方法没有连接错误。

我已经在链接器 - >输入 - >其他依赖项中包含了“DeveloperConsoleManager.lib”。请帮我弄清楚我到底做错了什么。 我很乐意添加任何所需的附加信息。

+0

_'DeveloperConsoleManager :: DeveloperConsoleLogic :: Add':不一致的dll linkage_ – 2017-10-16 08:43:52

+0

@ manni66对不起,请您详细说明 – RMad9248

+0

修复此问题。也许它修复了其余的问题。 – 2017-10-16 09:22:55

感谢@Igor Tandetnik和真棒的东西,那就是互联网,我想通了。我将其添加为答案,以便其他人可能会受益。

问题出在CString上。定义该函数的项目是一个动态链接库(dll),并且正在调用MFC应用程序。现在,问题是,MFC使用CString,而非MFC的DLL使用。

的CString中被定义为:

typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL<TCHAR> > CString; 

而被定义为:

typedef CStringT< TCHAR, StrTraitATL<TCHAR> > CString; 

这一点,因为你可以清楚地看到是不同的。我使用的解决方法是using CAtlString instead of CString。但是,如果遇到问题,请随时提出任何更好的方法。