亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

dylib 中缺少符號

dylib 中缺少符號

Go
冉冉說 2021-11-15 15:17:44
我正在嘗試圍繞 C++ 庫制作 C api,以便我以后可以將它包裝在 Golang 中。我首先簡單地用一個函數生成一個 dylib,以便我有一個參考。然后我圍繞我想要使用的實際庫制作了一個包裝器。當我從簡單的 dylib 生成所有符號時,我得到了這個:MacbookMainframe:c hydroflame$ nm -a clib/libxyz.dylib 0000000000000f90 T _Hello                 U dyld_stub_binder我只聲明了一個名為 的函數Hello,到目前為止一切順利當我做了我認為對實際庫等效的操作時,go 包裝器不會編譯,并且符號在何處生成MacbookMainframe:c hydroflame$ nm -a ../luxengine.net/steamc/libsteam.dylib                  U _SteamAPI_Init0000000000000f60 T __Z14SteamCAPI_Initv                 U dyld_stub_binder我期待的符號是_SteamCAPI_Init(帶有下劃線,因為顯然是Hello生成的,_Hello但我得到了一些奇怪的東西。我的編譯是錯誤的,還是應該生成的正常符號?源文件在這里可用(只有 30 條重要的行):https : //github.com/luxengine/steamhttps://github.com/luxengine/steamc編輯(對于未來的讀者):在撰寫本文時我的問題是我的頭文件聲明有extern "C" {但我的源文件沒有,所以無論如何 gcc 都會破壞名稱而 cgo 找不到它。MacbookMainframe:steamc hydroflame$ nm -a libsteam.dylib                  U _SteamAPI_Init0000000000000f60 T _SteamCAPI_Init                 U dyld_stub_binder
查看完整描述

1 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

首先,dyld_stub_binder是編譯C++時默認生成的符號。你不需要關心它。

其次,__Z14SteamCAPI_Initv實際上是正確的符號。由于 C++ 支持重載,因此 C++ 函數編譯時使用了經過修改的符號名稱,因此函數名稱不會相互沖突。例如,您有兩個函數void do_something(int a)void do_something(int a, int b),如果函數名沒有被破壞,鏈接器將如何解析符號名。

可以在此處找到有關 C++ 名稱修改的信息。


查看完整回答
反對 回復 2021-11-15
  • 1 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號