簡體   English   中英

用C ++進行名稱修飾或名稱修飾

[英]Name decoration or name mangling in c++

我已經使用cygwin生成了dll文件,並且正在嘗試在Visual Studio中使用它。

  1. 作為cygwin編譯的一部分,我得到了帶有錯誤函數名的DEF(.def)文件。
  2. 使用MSVC附帶的lib.exe程序,生成了.lib文件。

在MSVC中,我編寫了一個程序,該程序使用了所創建的lib文件中的功能。

我收到鏈接器錯誤。 當我檢查錯誤的名稱時,DEF文件中的一個與MSVC中引發的錯誤中的一個不同。 我對這兩者進行了分解,發現MSVC已使用__cdecl關鍵字破壞了函數名稱。

如何使用__cdecl關鍵字在cygwin中創建錯誤的函數名稱? 我在cgwin編譯中是否缺少任何標志?

視覺工作室:
亂七八糟的名字:

(__imp_?configure_tls_context @ client @ asio_http2 @ nghttp2 @@ YA?AVerror_code @ system @ boost @@ AAV456 @ AAVcontext @ ssl @ asio @ 6 @@ Z)

刪除名稱:

(__imp_class boost :: system :: error_code __cdecl nghttp2 :: asio_http2 :: client :: configure_tls_context(class boost :: system :: error_code&,class boost :: asio :: ssl :: context&)

Cygwin的DEF文件:雜亂的名稱:

_ZN7nghttp210asio_http26client21configure_tls_contextERN5boost6system10error_codeERNS2_4asio3ssl7contextE

刪除名稱:

nghttp2 :: asio_http2 :: client :: configure_tls_context(boost :: system :: error_code&,boost :: asio :: ssl :: context&)

作為基本規則; 使用C ++代碼,您始終需要使用完全相同的編譯器來編譯項目的所有代碼。 這包括可執行文件以及所有靜態和動態庫。 C ++沒有ABI規范,所有編譯器都可能以不同的方式處理名稱,甚至新的次要版本的編譯器都可能生成與以前版本所構建的代碼不兼容的代碼。 對於名稱處理或數據結構布局等沒有標准。

所以; 始終使用完全相同的編譯器重新編譯所有源代碼,或者為痛苦做准備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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