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
的定义会不匹配; char
与 wchar_t
.
要纠正此问题,请使用UNICODE
(和_UNICODE
)的一致定义构建所有必需的库和项目。
这可以用任何一个来完成;
#define UNICODE
#define _UNICODE
或者在项目设置中;
项目属性 > 常规 > 项目默认值 > 字符集
或者在命令行上;
/DUNICODE /D_UNICODE
替代方案也适用,如果不打算使用 UNICODE,请确保未设置定义,和/或在项目中使用多字符设置并始终如一地应用。
不要忘记在“发布”和“调试”版本之间保持一致。
【讨论】:
我的 log4cplus 项目在我的 Release_Unicode 和 Debug_Unicode 配置中具有“字符集”属性以“使用 Unicode 字符集”,这些配置是用于构建我的项目的配置。链接错误仍然出现。有什么我可能会遗漏的吗? 所有项目中都设置了它们吗?不知何故,UNICODE
未在项目中设置,导致链接器错误(或未设置)。给定log4cplus::tostringstream& get_macro_body_oss()
和typedef std::basic_ostringstream<tchar> tostringstream;
的定义,tchar
依赖于UNICODE
; #if defined (UNICODE)\n typedef wchar_t tchar;
。看起来记录器库仍然是使用 UNICODE
设置构建的,而您的项目没有设置它。
你的权利,我的项目设置为多字符,这是因为我使用的是配置为多字符的 Pantheios。我已将 log4cplus 项目更改为 Multi-Character 设置,成功编译,在链接器节点中更新了我的项目“附加库目录”和“附加依赖项”,现在一切都按预期编译。谢谢!
我在答案中添加了一条关于替代方案(即不使用 UNICODE)的注释。以上是关于log4cplus 无法解析的外部符号 LNK2001的主要内容,如果未能解决你的问题,请参考以下文章
错误 LNK2019:无法解析的外部符号“extern”C”这是啥错误?