【问题标题】:Unresolved external class member when linking static lib from dynamic dll从动态 dll 链接静态库时未解析的外部类成员
【发布时间】:2017-08-24 14:59:16
【问题描述】:

MS Visual Studio 2008。这似乎是一个名称混淆问题,但我找不到合适的搜索词来提供答案。

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

示例代码:

动态.h:

extern "C"
{
  __declspec(dllexport) BYTE GetData();
};

动态.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 问题,我检查了动态项目的项目设置:

Logging 项目:

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

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

【问题讨论】:

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


    【解决方案1】:

    虽然可能是偶然的,但该错误似乎表明链接器找不到ATL::CStringT&lt;&gt; 的宽字符版本(注意以下wchar_t 的实例):

    error LNK2019: unresolved external symbol "public: void __cdecl CLogging::AddString(class ATL::CStringT&lt;wchar_t,class StrTraitMFC&lt;wchar_t,class ATL::ChTraitsOS&lt;wchar_t&gt; &gt; &gt; const &amp;)" (?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 字符集进行构建。

    【讨论】:

    • 这是我的第一个想法,但我仔细检查了,所有项目都使用相同的“使用 Unicode 字符集”设置。我还将这个 Logging 项目拉到其他也使用 Unicode 的项目中,没有任何问题。
    • 其他检查:在某些版本的 Visual Studio 中,可以选择使用 wchar_t 作为本机类型进行编译(此处有一些描述:msdn.microsoft.com/en-us/library/dh8che7s.aspx)。如果这些设置不匹配,我肯定会看到项目无法合作的问题。
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2020-04-02
    相关资源
    最近更新 更多