在 macOS 上使用 cgo 並指定相對 dylib 路徑是一個常見的問題。 cgo 是 Go 語言用於與 C 語言互動的工具,而 dylib 是 macOS 上的動態連結函式庫。指定相對路徑可以使專案更加靈活和可移植。那麼,我們應該如何在 macOS 上的 cgo 中指定相對 dylib 路徑呢? php小編草莓將為您詳細解答。
我目前正在嘗試讓一個用 c 編寫的現有 dylib 在 go 中工作。 為此,我使用 cgo 並且一切都可以正確編譯。 當 go build 嘗試執行產生的可執行檔 dyld 時,找不到位於 go 來源目錄中的 dylib。
我正在使用這些 cflags 和 ldflags 但沒有成功:
// #cgo cflags: -i${srcdir} // #cgo ldflags: -l. -lmylibrary
我還了解到我可以使用魔術字串@executable_path
來指定相對庫搜尋路徑,但將其新增至-l 或嘗試將-install_name 新增至連結器標誌不會產生任何結果。
這是我收到的連結器錯誤訊息:
/Users/benedikt/sdk/go1.19.7/bin/go build -o /private/var/folders/.../T/GoLand/___1go_build_myapp myapp #gosetup /private/var/folders/.../T/GoLand/___1go_build_myapp dyld[58935]: Library not loaded: '/usr/local/lib/libMyLibrary.dylib' Referenced from: '/private/var/folders/.../T/GoLand/___1go_build_myapp' Reason: tried: '/usr/local/lib/libMyLibrary.dylib' (no such file), '/usr/lib/libMyLibrary.dylib' (no such file)
雖然沒有在 go 之外添加任何建置步驟,但如何正確配置 cgo 以使用位於二進位檔案稍後所在的相同資料夾中的 dylib,以便它可以與 go build 一起運行?
事實證明我已經非常接近我的目標,但實際庫中儲存的搜尋路徑是錯誤的。
我的問題中的程式碼在修改庫後工作正常,如下所示:
install_name_tool -id @loader_path/libMyLibrary.dylib libMyLibrary.dylib
雖然我還沒有找到一種乾淨的方法來讓goland 控制go build,將我的庫複製到運行應用程式的輸出目錄,但我初步透過將輸出目錄設為絕對路徑並添加將依賴項複製到輸出資料夾的預執行命令。
以上是如何在 macOS 上的 cgo 中指定相對 dylib 路徑的詳細內容。更多資訊請關注PHP中文網其他相關文章!