ICU 的未解析外部符号

Unresolved external symbol with ICU

本文关键字:外部 符号 ICU      更新时间:2023-10-16

我们有使用 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(无效)"(?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 (公共: __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,如这篇文章所述:

为什么当符号明显存在于我链接的静态库中时,会出现链接错误?

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

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

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

我尝试从这个网站下载预构建的 ICU 59.1 库。 但是有一个不同的链接器错误,不知道如何处理。

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

最后,我的同事发现了一些关于wchar_t潜在问题的信息。 就是这样 - 我们最好的理解是,由于我们的代码最初使用 MS Visual C++ 6.0,并且它能够在该上下文中链接到 ICU 3.2,因此它与wchar_t的旧定义相关联,但wchar_t的新定义正在改变名称修饰的生成方式。 将 -zc:wchar_t- 添加到编译选项中(在 VS 2017 中,转到项目属性、C/C++ 所有选项、"附加选项"行),导致它在完全重新编译后成功链接。

非常微妙。