2017-06-25 60 views
0

我使用cygwin生成了dll文件,我試圖在Visual Studio中使用它。在C++中名稱修飾或名稱損壞

  1. 我得到了DEF(.def)文件,這個文件中包含了錯誤的函數名稱,作爲cygwin編譯的一部分。
  2. 使用lib.exe程序作爲MSVC的一部分,我生成了.lib文件。

在MSVC中,我編寫了一個程序,它使用創建的lib文件中的函數。

我得到了鏈接器錯誤。 當我檢查了重名的名稱時,DEF文件中的名稱與MSVC中引發的錯誤中的名稱不同。 我把這兩個都去掉了,發現MSVC用__cdecl這個關鍵字破壞了函數名。

如何在012g關鍵字中在cygwin中創建破損的函數名稱?我在cgwin編譯中缺少任何標誌嗎?

的Visual Studio:
重整名稱:??

(__imp_ configure_tls_context @客戶@ asio_http2 @ nghttp2 @@ YA AVerror_code @系統@升壓@@ AAV456 @ AAVcontext @ SSL @ ASIO @ 6 @@ Z)

Demangled名稱:

(__imp_class的boost ::系統:: ERROR_CODE __cdecl nghttp2 :: asio_http2 ::客戶:: CONF igure_tls_context(類 的boost ::系統:: ERROR_CODE &,類boost ::支持ASIO :: SSL ::背景&)

從Cygwin的DEF文件: 重整名稱:

_ZN7nghttp210asio_http26client21configure_tls_contextERN5boost6system10error_codeERNS2_4asio3ssl7contextE

Demangled name:

nghttp2 :: asio_http2 ::客戶:: configure_tls_context(升壓::系統:: ERROR_CODE &,升壓:: ASIO :: SSL ::上下文&)

+2

這不僅僅是你必須處理的名字,還可能是調用約定和其他問題,比如POSIX兼容性。爲什麼不簡單地用VC++重新編譯庫?或者用Cygwin GCC編譯所有東西。 –

+0

我遵循以下鏈接https://cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin中的步驟。基於該鏈接中提供的解決方案,我認爲在cygwin中生成的dll可以在MSVC中使用,並且我在Cygwin中缺少一些編譯器標誌,因此我正面臨鏈接器錯誤。用VC++重新編譯庫是我的最後手段。 –

回答

2

作爲一般的規則;用C++代碼你總是需要編譯全部代碼爲你的項目用完全一樣的編譯器。這包括可執行文件和所有靜態和動態庫。 C++沒有ABI規範,所有編譯器都可能會對名稱進行不同的修改,甚至編譯器的新版本也可能產生與以前版本構建的代碼不兼容的代碼。 沒有標準名稱修改或數據結構佈局等。

所以;總是重新編譯全部源代碼與完全相同編譯器或準備一個痛苦的世界。

+0

我也認爲相同的「編譯器可能會改變名稱的不同」。我跟着這個鏈接[鏈接](https://cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin)在MSVC中使用cygwin生成的dll。也許提供的解決方案僅適用於C而不適用於C++。 –

相關問題