2017-10-16 25 views
0

我通常在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

回答

0

感謝@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。但是,如果遇到問題,請隨時提出任何更好的方法。