代码之家  ›  专栏  ›  技术社区  ›  Todd Hoatson

带ICU的未解析外部符号

  •  0
  • Todd Hoatson  · 技术社区  · 7 年前

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

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

    有人能帮助我们了解导致此链接错误的原因吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Todd Hoatson    7 年前

    我尝试构建ICU 60.2的静态库,但遇到了问题,无法获得ICU支持部门的帮助来构建它。

    我试着从下载预构建的ICU 59.1库 this website . 但却出现了另一个链接器错误,不知道该怎么办。

    我看到我的代码试图将wchar\u t*传递给icu::greater(),icu::greater()需要UnicodeString参数,所以我推断这就是类型转换导致构造UnicodeString的地方。我更改了代码,将其显式转换为UnicodeString,然后传递它,但仍然出现相同的链接器错误。

    最后,我的同事发现了一些关于 a potential problem with wchar_t . 就是这样,我们最清楚的理解是,因为我们的代码最初是用MS Visual C++6.0编写的,并且能够在该上下文中链接到ICU 3.2,所以它链接到了wchar\u t的旧定义,但wchar\u t的新定义正在改变名称修饰的生成方式。将-Zc:wchar\u t添加到编译选项(在VS 2017中,转到项目属性,C/C++所有选项,“附加选项”行),使其在完全重新编译后成功链接。

    非常微妙。