【问题标题】:Errors LNK 2019 and LNK2028 for one function in a class, other works fine类中一个函数的错误 LNK2019 和 LNK2028,其他工作正常
【发布时间】:2018-03-27 16:17:48
【问题描述】:

我通常在 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 文件中使用这些方法(类型:应用程序 (.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 error LNK1120: 2 unresolved externals E:\MD_69\Debug\DeveloperConsoleUi.exe

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

我已经在 Linker -> Input -> Additional Dependencies 中包含了“DeveloperConsoleManager.lib”。请帮我找出我到底做错了什么。 我很乐意添加所需的任何其他信息。

【问题讨论】:

  • 'DeveloperConsoleManager::DeveloperConsoleLogic::Add' : 不一致的 dll 链接
  • @manni66 很抱歉,请您详细说明一下
  • 修复它。也许它可以解决剩下的问题。
  • @manni66 警告是由于项目属性中的预处理器定义不正确。解决了,但是链接器错误仍然存​​在
  • CString 是一个宏,可以根据项目设置扩展到许多不同的东西。我怀疑这两个模块是用不同的设置构建的,并且不同意CString 的含义。

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


【解决方案1】:

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

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

CString in 定义为:

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

while in 定义为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 2012-02-09
    • 2023-03-27
    • 1970-01-01
    • 2012-07-05
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多