[英]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:無法解析的外部符號“ public:__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(公開:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(icu_3_2 :: UnicodeString const&)類)0UnicodeString @ icu_3_2 @@ QAE @ ABV01 @ H @ Z(公開:__thiscall icu_3_2 :: UnicodeString :: UnicodeString(class icu_3_2 :: UnicodeString const&,int))0UnicodeString @ icu_3_2 @@ QAE @ ABV01 @ HH @ Z(公共:__thiscall icu_3_2 :: UnicodeString :: UnicodeString(class icu_3_2: :UnicodeString const&,int,int))0UnicodeString @ icu_3_2 @@ QAE @ CPBGH @ Z(公共:__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(無符號短))0UnicodeString @ icu_3_2 @@ QAE @ H @ Z(公共:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(int)) 0UnicodeString @ icu_3_2 @@ QAE @ HHH @ Z(公共:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(int,int,int))0UnicodeString @ icu_3_2 @@ QAE @ PAGHH @ Z(公共:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(unsigned short *,int,int))?? 0UnicodeString @ icu_3_2 @@ QAE @ PBD0 @ Z(公開:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(char const *,char const *))0UnicodeString @ icu_3_2 @@ QAE @ PBDH0 @ Z(公開:__ thiscall icu_3_2 ::: UnicodeString :: UnicodeString(char const *,int,char const *))0UnicodeString @ icu_3_2 @@ QAE @ PBDHPAUUConverter @@ AAW4UErrorCode @@@@ Z(公共:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(char const *,int ,struct UConverter *,枚舉UErrorCode&))0UnicodeString @ icu_3_2 @@ QAE @ PBDHW4EInvariant @ 01 @@ Z(公共:__thiscall icu_3_2 :: UnicodeString :: UnicodeString(char const *,int,enum icu_3_2 :: UnicodeString :: EInvariant))0UnicodeString @ icu_3_2 @@ QAE @ PBG @ Z(公共:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(unsigned short const *))0UnicodeString @ icu_3_2 @@ QAE @ PBGH @ Z(公共:__ thiscall icu_3_2 :: UnicodeString :: UnicodeString(unsigned short const *,int))0UnicodeString @ icu_3_2 @@ QAE @ XZ(公共:__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 *傳遞給需要UnicodeString參數的icu :: greater(),因此我推斷出這是類型轉換導致構造UnicodeString的地方。 我更改了代碼以將其顯式轉換為UnicodeString,然后將其傳遞給我,但是我仍然遇到相同的鏈接器錯誤。
最后,我的同事找到了一些有關wchar_t潛在問題的信息。 就是這樣-我們最好的理解是,由於我們的代碼最初是與MS Visual C ++ 6.0一起使用的,並且能夠鏈接到ICU 3.2,所以它與wchar_t的舊定義鏈接,但是與wchar_t的新定義鏈接。 wchar_t正在更改名稱修飾的生成方式。 將-Zc:wchar_t-添加到編譯選項(在VS 2017中,轉到“項目屬性”,“ C / C ++所有選項”,“其他選項”行),導致它在完全重新編譯后成功鏈接。
非常微妙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.