对于类中的一个函数,LNK 2019和LNK2028出错,其他工作正常

时间:2017-10-16 07:46:59

标签: c++ visual-c++ linker

我通常在c#工作,而且我的智慧不在这个问题上。我使用Walkthrough: Creating and Using a Dynamic Link Library (C++)创建了动态链接库。

我已经定义了两种方法,如下所示

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文件中使用这些方法(类型:Application(.exe))。当我构建解决方案时,存在以下链接器错误

  

警告1警告C4273:'DeveloperConsoleManager :: DeveloperConsoleLogic :: Add':不一致的dll链接e:\ md_69 \ developerconsolemanager \ developerconsolemanager.cpp 10

     

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

     

错误3错误LNK2028:未解析的令牌(0A0004F1)“public:static bool __cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile(class ATL :: CStringT>>)”(?CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV ?$ CStringT @ _WV?$ StrTraitMFC_DLL @ _WV?$ ChTraitsCRT @ _W @ ATL @@@@@ ATL @@@ Z)在函数“public:void __thiscall CSaSsiConsoleUi :: UploadSsiCheck(void)”中引用(?UploadSsiCheck @ CSaSsiConsoleUi @ @ $$ FQAEXXZ)E:\ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

     

错误4错误LNK2019:未解析的外部符号“public:static bool __cdecl DeveloperConsoleManager :: DeveloperConsoleLogic :: CheckforValidFile(class ATL :: CStringT>>)”(?CheckforValidFile @ DeveloperConsoleLogic @ DeveloperConsoleManager @@ $$ FSA_NV?$ CStringT @ _WV?$ StrTraitMFC_DLL @ _WV?$ ChTraitsCRT @ _W @ ATL @@@@@ ATL @@@ Z)在函数“public:void __thiscall CSaSsiConsoleUi :: UploadSsiCheck(void)”中引用(?UploadSsiCheck @ CSaSsiConsoleUi @@ $ $ FQAEXXZ)E:\ MD_69 \ DeveloperConsoleUI \ SaSsiConsoleUI.obj

     

错误5错误LNK1120:2个未解析的外部E:\ MD_69 \ Debug \ DeveloperConsoleUi.exe

“添加”方法没有链接器错误。

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

1 个答案:

答案 0 :(得分:0)

感谢@Igor Tandetnik和互联网这个令人敬畏的东西,我想通了。我将其添加为答案,以便其他人可能受益。

问题在于CString。定义函数的项目是动态链接库(dll),调用是从MFC应用程序进行的。现在,问题在于,MFC用于CString,而非MFC dll使用。

CString in定义为:

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

而in定义为:

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

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