log4cplus 无法解析的外部符号 LNK2001

Posted

技术标签:

【中文标题】log4cplus 无法解析的外部符号 LNK2001【英文标题】:log4cplus unresolved external symbol LNK2001 【发布时间】:2016-04-06 08:58:56 【问题描述】:

我正在尝试在我的项目中使用 log4cplus 作为记录器。我已经在 VS2013 中成功下载并编译了“Debug_Unicode”和“Release_Unicode”的 log4cplus(项目在 Release 和 Debug 中成功编译)。

在我的“项目属性->配置属性”中我添加了:

    'log4cplus\include' 到 'C/C++->All Options->Additional Include Directories' 'log4cplus\msvc10\Win32\obj.log4cplus.Release_Unicode' 到 '链接器->所有选项->附加库目录' “链接器->所有选项->其他依赖项”中的“log4cplusu.lib”

我还确保我在 log4cplus 项目和我自己的项目中使用相同的运行时库,在我的例子中是多线程 DLL (/MD)。

但是当我尝试构建我的项目时,我收到以下链接错误:

error LNK2001: unresolved external symbol "class
std::basic_ostringstream<char,struct std::char_traits<char>,class
std::allocator<char> > & __cdecl
log4cplus::detail::get_macro_body_oss(void)"
(?get_macro_body_oss@detail@log4cplus@@YAAAV?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)

error LNK2001: unresolved external symbol "void __cdecl
log4cplus::detail::macro_forced_log(class log4cplus::Logger const
&,int,class std::basic_string<char,struct std::char_traits<char>,class
std::allocator<char> > const &,char const *,int,char const *)"
(?macro_forced_log@detail@log4cplus@@YAXABVLogger@2@HABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PBDH2@Z)

fatal error LNK1120: 2 unresolved externals

【问题讨论】:

我刚刚遇到了与 Qt 类似的问题,以下链接为我提供了合适的解决方案:***.com/questions/14170770/…,当然,Q_OBJECT hack 不起作用... 【参考方案1】:

Windows UNICODE 构建是使用TCHAR 等定义为wchar_t 等构建的。当不使用UNICODE 构建时定义为TCHAR 定义为char 等的构建。

构建一个定义了UNICODE 的库并尝试将其链接到未定义UNICODE 的项目中会导致链接器错误,因为TCHAR 的定义会不匹配; charwchar_t.

要纠正此问题,请使用UNICODE(和_UNICODE)的一致定义构建所有必需的库和项目。

这可以用任何一个来完成;

#define UNICODE
#define _UNICODE

或者在项目设置中;

项目属性 > 常规 > 项目默认值 > 字符集

或者在命令行上;

/DUNICODE /D_UNICODE

替代方案也适用,如果不打算使用 UNICODE,请确保未设置定义,和/或在项目中使用多字符设置并始终如一地应用。

不要忘记在“发布”和“调试”版本之间保持一致。

【讨论】:

我的 log4cplus 项目在我的 Release_Unicode 和 Debug_Unicode 配置中具有“字符集”属性以“使用 Unicode 字符集”,这些配置是用于构建我的项目的配置。链接错误仍然出现。有什么我可能会遗漏的吗? 所有项目中都设置了它们吗?不知何故,UNICODE 未在项目中设置,导致链接器错误(或未设置)。给定log4cplus::tostringstream&amp; get_macro_body_oss()typedef std::basic_ostringstream&lt;tchar&gt; tostringstream; 的定义,tchar 依赖于UNICODE#if defined (UNICODE)\n typedef wchar_t tchar;。看起来记录器库仍然是使用 UNICODE 设置构建的,而您的项目没有设置它。 你的权利,我的项目设置为多字符,这是因为我使用的是配置为多字符的 Pantheios。我已将 log4cplus 项目更改为 Multi-Character 设置,成功编译,在链接器节点中更新了我的项目“附加库目录”和“附加依赖项”,现在一切都按预期编译。谢谢! 我在答案中添加了一条关于替代方案(即不使用 UNICODE)的注释。

以上是关于log4cplus 无法解析的外部符号 LNK2001的主要内容,如果未能解决你的问题,请参考以下文章

错误 LNK2019:无法解析的外部符号“extern”C”这是啥错误?

错误 LNK2019:无法解析的外部符号“extern”C”这是啥错误?

LNK2019 无法解析的外部符号

dcmtk lnk2019 无法解析外部符号

error LNK2001: 无法解析的外部符号

error LNK2019: 无法解析的外部符号