【问题标题】:Unresolved external symbol with ICUICU 无法解析的外部符号
【发布时间】: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


【解决方案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++ 所有选项、“附加选项”行),使其在完全重新编译后链接成功。

非常微妙。

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2011-03-21
    • 2019-01-14
    • 2012-07-10
    • 2012-04-14
    相关资源
    最近更新 更多