从动态dll

时间:2017-03-30 15:22:22

标签: c++ dll dllexport name-mangling extern-c

MS Visual Studio 2008.这似乎是一个名称错位问题,但我找不到合适的搜索字词来提出答案。

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

示例代码:

Dynamic.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)

编辑:认为这可能是Unicode或MFC问题,我检查了动态项目的项目设置:

Dynamic project settings

Logging项目:

Logging project settings

另外两个项目也可以毫无问题地引入Logging:

Working project settings 1

Working project settings 2

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

1 个答案:

答案 0 :(得分:0)

虽然可能是偶然的,但错误似乎表明链接器无法找到ATL::CStringT<>的宽字符版本(请注意以下wchar_t的实例):

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)

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