我们有使用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:未解析的外部符号“public:\u thiscall”
icu\u 3\u 2::UnicodeString::UnicodeString(wchar\u t const*)”
(??0UnicodeString@icu_3_2@@QAE@PB_W@Z) 在函数“void”中引用
__cdecl icu\U测试(无效)”(?icu\U测试@YAXXZ)
(0Unicode是否正在销毁构造函数?)当我使用dumpbin查看ICU库中导出的符号时,我看到以下内容:
??0UnicodeString@icu_3_2@@QAE@ABV01@@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(类icu\u 3\u 2::UnicodeString常量)(&)
??0UnicodeString@icu_3_2@@QAE@ABV01@H@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(类icu\u 3\u 2::UnicodeString const,int))
??0UnicodeString@icu_3_2@@QAE@ABV01@HH@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(类icu\u 3\u 2::UnicodeString const,int,int))
??0UnicodeString@icu_3_2@@QAE@CPBGH@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(有符号字符,无符号短常量*,int))
??0UnicodeString@icu_3_2@@QAE@G@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(无符号短))
??0UnicodeString@icu_3_2@@QAE@H@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(int))
??0UnicodeString@icu_3_2@@QAE@HHH@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(int,int,int))
??0UnicodeString@icu_3_2@@QAE@PAGHH@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(无符号短*,int,int))
??0UnicodeString@icu_3_2@@QAE@PBD0@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(char const*,char const*))
??0UnicodeString@icu_3_2@@QAE@PBDH0@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(char const*,int,char const*))
??0UnicodeString@icu_3_2@@QAE@PBDHPAUUConverter@@AAW4UErrorCode@@@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(char const*、int、struct UConverter*、enum UErrorCode&)
??0UnicodeString@icu_3_2@@QAE@PBDHW4EInvariant@01@@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(char const*,int,enum icu\u 3\u 2::UnicodeString::EInvariant))
??0UnicodeString@icu_3_2@@QAE@PBG@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(无符号短常量*))
??0UnicodeString@icu_3_2@@QAE@PBGH@Z(公共:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(无符号短常量*,int))
??0UnicodeString@icu_3_2@@QAE@XZ(公用:\uu thiscall icu\u 3\u 2::UnicodeString::UnicodeString(void))
因此,所有这些都与第一个未解析的外部不匹配,因为标识符末尾的内容(例如@@QAE@PB_W@Z) ,这不是来自我们的代码。不确定这是如何产生的,也不知道该怎么做。
我尝试下载最新版本的ICU(60.2),但它只有x64版本,而我们的程序是为x86构建的。
我确保ICU库文件夹包含在链接设置中。
我们还确保定义U\U STATIC\U实现,如本文所述:
Why do I get link errors when the symbol is clearly present in the static library I link against?
在那篇文章中,他们能够找到图书馆中的相关符号,但我们无法找到。
有人能帮助我们了解导致此链接错误的原因吗?