ICU 的未解析外部符号
Unresolved external symbol with 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:未解析的外部符号"公共:__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++ 所有选项、"附加选项"行),导致它在完全重新编译后成功链接。
非常微妙。
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 未解析的外部符号_MsiLocateComponentW@12.
- 在C++中使用 gRPC 时未解析的外部符号
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 仅在少数方法(静态或共享库)中解析的外部符号
- 未解析的外部符号"__declspec(dllimport)与 Spdlog c++ 库
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 使用静态 constexpr 成员的未解析外部符号
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- Dlib LNK2001未解析的外部符号USER_ERROR__consistent_build_configurati
- 矛盾的未解决的外部符号+未使用的库与VS2017和FFMPEG 4
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- 类模板上一个特定函数的未解析外部符号
- LNK2001:未解析的外部符号public:static类std::vector