ICU

时间:2018-01-23 03:07:12

标签: c++ visual-studio linker icu

我们有使用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?

在那篇文章中,他们能够在图书馆中找到相关的符号,但我们不能。

任何人都可以帮助我们了解导致此链接错误的原因吗?

1 个答案:

答案 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 ++所有选项,'其他选项'行),使其在完全重新编译后成功链接。

非常微妙。