我们有使用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:__ thishisall 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&amp;)) ?? 0UnicodeString @ icu_3_2 @@ QAE @ ABV01 @H @ Z(public:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(class icu_3_2 :: UnicodeString const&amp;,int)) ?? 0UnicodeString @ icu_3_2 @@ QAE @ ABV01 @HH @ Z(public:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(class icu_3_2 :: UnicodeString const&amp;,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&amp;)) ?? 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(公开:__ 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?
在那篇文章中,他们能够在图书馆中找到相关的符号,但我们不能。
任何人都可以帮助我们了解导致此链接错误的原因吗?
答案 0 :(得分:1)
我尝试构建一个ICU 60.2的静态库,但遇到了问题,我无法从ICU支持中获得帮助来构建它。
我尝试从this website下载预先构建的ICU 59.1库。但是有一个不同的链接器错误,不知道如何处理它。
我看到我的代码试图将wchar_t *传递给icu :: greater(),它需要UnicodeString参数,因此我推断这是类型转换导致构造UnicodeString的地方。我更改了代码以显式转换为UnicodeString然后传递,但我仍然遇到相同的链接器错误。
最后,我的同事发现了一些关于a potential problem with wchar_t的信息。所以就是这样 - 我们最好的理解是,因为我们的代码最初使用的是MS Visual C ++ 6.0,并且它能够在该上下文中链接到ICU 3.2,所以它与wchar_t的旧定义相关联,但新的定义是wchar_t正在改变生成名称修饰的方式。将-Zc:wchar_t-添加到编译选项(在VS 2017中,转到项目属性,C / C ++所有选项,'其他选项'行),使其在完全重新编译后成功链接。
非常微妙。