【发布时间】:2018-07-01 19:00:15
【问题描述】:
我们的代码使用 ICU 库来处理 Unicode 字符串。当我们尝试构建它时,我们没有得到任何编译错误,但链接失败。我用以下代码创建了一个小测试程序:
#define U_STATIC_IMPLEMENTATION
#undef INT64_C
#undef UINT64_C
#include <unicode/coll.h>
void icu_test()
{
UErrorCode success = U_ZERO_ERROR;
Collator* myCollator = Collator::createInstance(success);
VERIFY(U_SUCCESS(success));
myCollator->setStrength(Collator::QUATERNARY);
UChar Word1[10] = _T("this");
UChar Word2[10] = _T("that");
// Compare two strings in the default locale
bool result = myCollator->greater(Word1, Word2);
}
此程序也无法链接到:
错误 LNK2019:未解析的外部符号“公共:__thiscall icu_3_2::UnicodeString::UnicodeString(wchar_t const *)" (??0UnicodeString@icu_3_2@@QAE@PB_W@Z) 在函数“void”中引用 __cdecl icu_test(void)" (?icu_test@@YAXXZ)
(0UnicodeString 可能是构造函数吗?)当我使用 dumpbin 查看 ICU 库中导出的符号时,我看到以下内容:
??0UnicodeString@icu_3_2@@QAE@ABV01@@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(class icu_3_2::UnicodeString const &)) ??0UnicodeString@icu_3_2@@QAE@ABV01@H@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(class icu_3_2::UnicodeString const &,int)) ??0UnicodeString@icu_3_2@@QAE@ABV01@HH@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(class icu_3_2::UnicodeString const &,int,int)) ??0UnicodeString@icu_3_2@@QAE@CPBGH@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(signed char,unsigned short const *,int)) ??0UnicodeString@icu_3_2@@QAE@G@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(unsigned short)) ??0UnicodeString@icu_3_2@@QAE@H@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(int)) ??0UnicodeString@icu_3_2@@QAE@HHH@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(int,int,int)) ??0UnicodeString@icu_3_2@@QAE@PAGHH@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(unsigned short *,int,int)) ??0UnicodeString@icu_3_2@@QAE@PBD0@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(char const *,char const *)) ??0UnicodeString@icu_3_2@@QAE@PBDH0@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(char const *,int,char const *)) ??0UnicodeString@icu_3_2@@QAE@PBDHPAUUConverter@@AAW4UErrorCode@@@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(char const *,int,struct UConverter *,enum UErrorCode &)) ??0UnicodeString@icu_3_2@@QAE@PBDHW4EInvariant@01@@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(char const *,int,enum icu_3_2::UnicodeString::EInvariant)) ??0UnicodeString@icu_3_2@@QAE@PBG@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(unsigned short const *)) ??0UnicodeString@icu_3_2@@QAE@PBGH@Z (public: __thiscall icu_3_2::UnicodeString::UnicodeString(unsigned short const *,int)) ??0UnicodeString@icu_3_2@@QAE@XZ (public: __thiscall icu_3_2::UnicodeString::UnicodeString(void))
因此,这些都与第一个未解析的外部完全匹配,因为标识符末尾的内容(例如 @@QAE@PB_W@Z)不是来自我们的代码。不确定这是如何生成的或如何处理它。
我尝试下载最新版本的 ICU (60.2),但它只有 x64 版本,而我们的程序是为 x86 构建的。
我确保 ICU 库文件夹包含在链接设置中。
我们还确保定义 U_STATIC_IMPLEMENTATION,如本文所述:
Why do I get link errors when the symbol is clearly present in the static library I link against?
在那篇文章中,他们能够在库中找到相关符号,但我们不能。
谁能帮助我们了解导致此链接错误的原因?
【问题讨论】:
-
如何构建代码?你能发布更多细节吗?
-
@pe3k,我们使用 Visual Studio 2017。以下是一些构建选项:预处理器定义:WIN32;_DEBUG;_CONSOLE 运行时库:多线程调试 DLL 目标机器:MachineX86 附加依赖项:icudt。库; icuin.lib; icuio.lib; icuuc.lib; icule.lib; iculx.lib 实际上,我之前忘记添加 .lilb 依赖项,所以我现在添加了它们,发现我们只有 1 个未解析的外部,所以我正在更新原始帖子以反映这一点。
标签: c++ visual-studio linker icu