我通常在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” - >输入 - >额外的依赖关系。请帮我弄清楚我到底做错了什么。 我很乐意添加所需的任何其他信息。
答案 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。但是,如果您遇到过,请随时提出更好的建议。