Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Go-Anwendungen mit Funktionen in einer .so-Datei interagieren?

Wie können Go-Anwendungen mit Funktionen in einer .so-Datei interagieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-02 05:25:30800Durchsuche

How Can Go Applications Interact with Functions Inside a .so File?

Funktionen in einer SO-Datei aus Go aufrufen

Frage: Können Go-Anwendungen mit Funktionen in einer statischen Objektdatei (.so) interagieren?

Antwort: Ja, es ist möglich, Funktionen aus einer Bibliothek mit Go zu laden und aufzurufen. Das integrierte Syscall-Paket bietet jedoch trotz gegenteiliger Online-Behauptungen nicht die LoadLibrary-Funktion.

Um dies zu erreichen, können Sie cgo nutzen, ein Tool, das C- und Go-Code verbindet. Hier ist ein Beispiel mit dlopen und verwandten Funktionen aus der POSIX C-Bibliothek:

<code class="go">// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>
import "C"

import fmt

func foo() {
    handle := C.dlopen(C.CString("libfoo.so"), C.RTLD_LAZY)
    bar := C.dlsym(handle, C.CString("bar"))
    fmt.Printf("bar is at %p\n", bar)
}</code>

In diesem Beispiel:

  • LDFLAGS gibt an, dass die dlopen-Bibliothek mit dem Go-Programm verknüpft werden soll.
  • dlopen lädt das gemeinsam genutzte Objekt in den Speicher.
  • dlsym ruft die Adresse der Bar-Funktion innerhalb der geladenen Bibliothek ab.
  • Die fmt.Printf-Anweisung gibt die Speicheradresse wo bar aus befindet sich.

Wenn Sie diesem Ansatz folgen, können Sie Funktionen in externen Bibliotheken nahtlos aus Ihrem Go-Code aufrufen.

Das obige ist der detaillierte Inhalt vonWie können Go-Anwendungen mit Funktionen in einer .so-Datei interagieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn