C++ 从动态dll链接静态库时未解析的外部类成员

C++ 从动态dll链接静态库时未解析的外部类成员,c++,dll,dllexport,name-mangling,extern-c,C++,Dll,Dllexport,Name Mangling,Extern C,微软Visual Studio 2008。这似乎是一个名称混乱的问题,但我找不到合适的搜索词来给出答案 我有一个动态库,其中有一个类,它使用静态日志库中的日志类。动态库在项目设置中导入静态库。我在其他项目中使用这个静态库,所以我知道它编译和链接时不会出错 示例代码: 动态h: extern "C" { __declspec(dllexport) BYTE GetData(); }; Dynamic.cpp: #include "MyClass.h" static MyClass g_In

微软Visual Studio 2008。这似乎是一个名称混乱的问题,但我找不到合适的搜索词来给出答案

我有一个动态库,其中有一个类,它使用静态日志库中的日志类。动态库在项目设置中导入静态库。我在其他项目中使用这个静态库,所以我知道它编译和链接时不会出错

示例代码:

动态h:

extern "C"
{
  __declspec(dllexport) BYTE GetData();
};
Dynamic.cpp:

#include "MyClass.h"

static MyClass g_Inst;

BYTE GetData() { return g_Inst.GetData(); }
MyClass.h:

#include "Logging.h"

class MyClass
{
public:
  BYTE GetData() { CLogging::Instance().AddString("Test"); }
};
链接器:

error LNK2019: unresolved external symbol "public: void __cdecl CLogging::AddString(class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsOS<wchar_t> > > const &)" (?AddString@CLogging@@QAAXABV?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsOS@_W@ATL@@@@@ATL@@@Z) referenced in function "public: unsigned char __cdecl MyClass::GetData(void)" (?GetData@MyClass@@QAAEXZ)
错误LNK2019:未解析的外部符号“public:void\u cdecl clocking::AddString(类ATL::CStringT const&)”(?AddString@CLogging@@卡萨巴夫$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsOS@_W@ATL@@@@ATL@@@Z)在函数“public:unsigned char\uu cdecl MyClass::GetData(void)”中引用(?GetData@MyClass@@QAEXZ)
编辑:考虑到可能是Unicode或MFC问题,我检查了动态项目的项目设置:

日志项目:

还有另外两个项目也可以毫无问题地进行日志记录:


我能看到的唯一区别是,不起作用的是作为动态dll构建的。

虽然可能是偶然发生的,但该错误似乎表明链接器找不到宽字符版本的
ATL::CStringT
(请注意以下
wchar\u t
的实例):

错误LNK2019:未解析的外部符号“public:void\u cdecl clocking::AddString(类ATL::CStringT const&)”(?AddString@CLogging@@卡萨巴夫$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsOS@_W@ATL@@@@ATL@@@Z)在函数“public:unsigned char\uu cdecl MyClass::GetData(void)”中引用(?GetData@MyClass@@QAAEXZ)


您可以检查项目设置,并尝试使用非Unicode字符集进行构建。

这是我的第一个想法,但我仔细检查了,所有项目都使用相同的“使用Unicode字符集”设置。我还将此日志项目拉入了其他也使用Unicode的项目中,没有任何问题。还有一些需要检查的问题:在Visual Studio的某些版本中,有一个选项可以将
wchar\u t
编译为本机类型,也可以不编译(此处有一些描述:)。我肯定看到过如果这些设置不匹配,项目将无法合作的问题。