c++ - ICU 无法解析的外部符号

标签 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);
}

此程序也无法链接到:

error LNK2019: unresolved external symbol "public: __thiscall icu_3_2::UnicodeString::UnicodeString(wchar_t const *)" (??0UnicodeString@icu_3_2@@QAE@PB_W@Z) referenced in function "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(类 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(无符号短)) ??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)不是来 self 们的代码,因此这些都与第一个未解析的外部完全匹配。不确定这是如何生成的或如何处理。

我尝试下载最新版本的 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?

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

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

最佳答案

我尝试构建 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++ 所有选项”、“其他选项”行),使其在完全重新编译后成功链接。

非常微妙。

关于c++ - ICU 无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48393570/

相关文章:

c++ - 为什么 Visual C++ 2015 允许 std::atomic 赋值?

android - undefined reference 错误 - rand

c++ - 尝试构建共享库 g++/mac 时 undefined symbol _main

c++ - 如何解决-------在mingw上对 `__chkstk_ms'的 undefined reference -------

c++ - 读取不同数据类型的二进制数据

c++ - CMAKE:如何安装目标的依赖项

c++ - 允许各种函数类型的非类型模板参数?

c++ - Autoexp.dat 版本

c# - Visual Studio 2010 显示代码隐藏的可用事件

c++ - 在新的 Visual Studio 项目中包含任何 Eigen 3.3.1 文件都不会编译