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

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

通過Windows cgo-> gcc-> ld進行的DLL鏈接給出了“(函數)的未定義引用”錯誤。

通過Windows cgo-> gcc-> ld進行的DLL鏈接給出了“(函數)的未定義引用”錯誤。

Go
元芳怎么了 2021-04-30 15:15:59
我真的更喜歡GLFW而不是Glut,并且想要在Go 1.0.1 64位的Windows 64位環境下使用它的Golang綁定。在Linux下,綁定可以完美地工作。這在原則上是可行的Windows下- GitHub的用戶家校會設法來做到這一點,但他是在Win32和他的提示沒有解決我的問題呢。但是,我確實基于tdm64-gcc-4.6.1設置了完整且干凈的Mingw64?,F在這是一件奇怪的事情-使freeglut綁定在64位Windows,64位Go 1.0.1下可以工作-glfw綁定對我來說失敗了。我想弄清楚為什么,因為它們本質上都使用相同的cgo功能和技術。注意,我目前有一個自制的,半熟但基本上可以正常工作的替換軟件包,該軟件包使用LoadLibrary / GetProcAddress調用在Go中公開glfw.dll。這行得通,但我認為硬連接的內置CGO綁定比無數Syscall(),Syscall6(),Syscall9(),Syscall12()等Go func調用更為可取。如果Win32和Linux gophers可以擁有此功能,為什么我們不Win64呢?到目前為止,這是我的設置:我有一個帶有三個補丁的Golang版本,以使lib鏈接在應用cgo時起作用我已經使用MinGW64成功地將最新的freeglut和GLFW庫編譯為64位DLL。頭文件glut.h,freeglut * .h和glfw.h放在\ MinGW64 \ x86_64-w64-mingw32 \ include \ GL中(在gl.h,gloux.h,glu.h之后)庫文件libfreeglut.a和libglfwdll.a放在\ MinGW64 \ x86_64-w64-mingw32 \ lib(libglu32.a,libopengl32.a旁邊)中64位dll glfw.dll和freeglut64.dll放在\ windows和\ windows \ system32中(opengl32.dll,glu32.dll旁邊)我相信freeglut64.dll和glfw.dll都可以工作-至少在安裝DLL之后,它們的大多數示例程序都可以運行。一切都應該準備就緒,對不對?現在首先要進行成功綁定(我不需要),freeglut-當我進入-x github.com/zombiezen/Go-GLUT/glut時,一切都構建良好,我可以成功創建一個glut窗口,在從.go源文件編譯的Windows test.exe中顯示一個三角形。感謝-x,go get演示了它的構建過程:是的,這是一個很麻煩的工作-但實際上始終是相同的錯誤,并且在構建過程中相當晚。請注意,如果未定義#define GLFW_DLL,除沒有__imp_前綴外,我得到的輸出基本上是相同的-靜態鏈接既不鼓勵使用Go,也不適合此特定用例?,F在,當gcc抱怨“未定義的引用”時,根據我在Google上的搜索,可能有多種原因...找不到DLL不會失敗-它們位于適當的位置,對于freeglut64.dll,它可以正常工作找不到.a庫肯定是成功的-它們在適當的位置,并且libfreeglut.a可以工作,如果我將-lglfwdll更改為-lblafoobar,則gcc會更早地失敗并正確地抱怨“找不到blafoobar”-因此它確實找到了libglfwdll.a。庫依賴關系的順序?我嘗試將-lglfwdll作為第一個庫(在-lglu32 -lopengl32之前)和最后一個庫(在這兩個之后),沒有區別。Golang glfw綁定有問題嗎?別這么認為,它適用于其他人,包括適用于chsc的Windows(32位)TL; DR -在Windows 64位,圍棋1.0.1 64位完全修補,CGO成功生成的東西飼料到GCC的兩個freeglut和GLFW。然后,GCC高興地吃掉了那些東西來建立freeglut綁定,但是拒絕了它來建立glfw綁定,所有C.funcs()都帶有“未定義的引用”。libfreeglut和libglfwdll均已正確構建并安裝為64位DLL,并且.h / .a libs均已正確定位。可能是什么原因?
查看完整描述

3 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

最新版本的Go,GLFW和Mingw-w64不再是問題。


查看完整回答
反對 回復 2021-05-10
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

我可以想到兩種可能性:

  1. 這些符號實際上不在庫中。您可以使用進行檢查nm。確保符號類型是大寫字母;如果只有小寫代碼,則庫構建不正確。

  2. 您有循環依賴關系。即,庫A依賴于庫B,而庫B又依賴于A。您可以解決此問題,第二次將庫添加到命令中,或使用鏈接器組(請參閱參考資料ld --help)。

請注意,命令行上的庫順序非常重要:鏈接器按照它們出現的順序依次讀取每個庫,搜索當時所需的符號,然后繼續。如果符號是由較晚的庫首先引用的,則鏈接器將不會重新訪問較早的庫以查找定義。這就是循環依賴成為問題的原因。


查看完整回答
反對 回復 2021-05-10
  • 3 回答
  • 0 關注
  • 523 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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