首頁 >後端開發 >Golang >如何從 Go 呼叫靜態物件檔案中的函數?

如何從 Go 呼叫靜態物件檔案中的函數?

Patricia Arquette
Patricia Arquette原創
2024-11-03 12:04:291044瀏覽

How to Call Functions in Static Object Files from Go?

從 Go 呼叫靜態物件檔案中的函數

您尋求從 Go 中的共用程式庫 (.so) 檔案呼叫函數。雖然您可能遇到為此目的使用 syscall.LoadLibrary 的建議,但您的嘗試卻遇到了錯誤「未定義:syscall.LoadLibrary」。

但是,載入共用程式庫並存取確實是可行的它的功能來自Go。要在 POSIX 平台上實現此目的,您可以利用 cgo 並與系統的本機 API 進行互動。

這是使用 cgo 的簡單示範:

<code class="go">// +build linux darwin
// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>

package main

import (
    "C"
    "fmt"
)

func foo() {
    // Load the shared library
    handle := C.dlopen(C.CString("libfoo.so"), C.RTLD_LAZY)

    // Retrieve the function pointer from the library
    bar := C.dlsym(handle, C.CString("bar"))

    // Print the function pointer address
    fmt.Printf("bar is at %p\n", bar)
}

func main() { foo() }</code>

在此例如:

  • 建置指令限制編譯到 Linux 和 Darwin 平台。
  • #cgo LDFLAGS:-ldl 將執行檔連結到動態連結器函式庫 (libdl)。
  • #include ;為 dlopen 和 dlsym 函數匯入必要的 C 頭檔。
  • foo 函數載入共享庫,檢索「bar」函數的函數指針,並列印其位址。

請注意,確切的語法和函數名稱可能會有所不同,具體取決於您的底層系統和編譯器。透過利用 cgo 並與本機系統 API 交互,您可以彌合 Go 和共享庫之間的差距,從而擴展應用程式的功能。

以上是如何從 Go 呼叫靜態物件檔案中的函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn