簡體   English   中英

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:無法解析的外部符號“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM