Heim > Backend-Entwicklung > Golang > Kann nicht mit cgo kompiliert werden

Kann nicht mit cgo kompiliert werden

WBOY
Freigeben: 2024-02-09 16:21:09
nach vorne
1263 Leute haben es durchsucht

Kann nicht mit cgo kompiliert werden

Der PHP-Editor Baicao stößt beim Schreiben von Code häufig auf einige Probleme und Herausforderungen. Eines der häufigsten Probleme ist die Fehlermeldung „Mit CGO kann nicht kompiliert werden“ beim Kompilieren mit CGO. Dieses Problem kann verschiedene Ursachen haben, z. B. fehlende abhängige Bibliotheken, falsche Umgebungskonfiguration usw. Die Lösung dieses Problems erfordert eine sorgfältige Prüfung des Codes und der Umgebung sowie die Durchführung entsprechender Anpassungen und Korrekturen basierend auf der spezifischen Situation. In diesem Artikel werden wir einige Methoden und Techniken zur Lösung dieses Problems vorstellen, um Ihnen bei der Bewältigung dieses Problems zu helfen.

Frageninhalt

Welche Go-Version (Go-Version) verwenden Sie?

$ go version
go version go1.20.2 linux/amd64
Nach dem Login kopieren

Projektstruktur:

directory structure --
example --> main.go
        -->lib
            lib.c
            lib.h
Nach dem Login kopieren

main.go

package main

// #include "lib/lib.h"
// #include <stdio.h>
// #include <stdlib.h>
import "c"
import (
    "fmt"
    "unsafe"
)

func main() {
    cstrin := c.cstring("welcome")
    s1 := c.struct_s1{b: cstrin, a: 100}

    c.f32_123(&s1)
    cs := c.gostring(s1.b)
    fmt.println(cs)
    fmt.println(s1)
    c.free(unsafe.pointer(cstrin))
}
Nach dem Login kopieren

lib/lib.c

#include <stdlib.h>
#include <stdio.h>

void printc(char *str, int *t)
{
     str = "test";
     printf("%d\n", *t);
     *t = 30;
     printf("%s\n", str);
}

void f32_123(struct s1 *s)
{
     printf("%s\n", s->b);
     s->a = 10;
     s->b = "hello123";
     printf("%d\n", s->a);
     printf("%s\n", s->b);
}
Nach dem Login kopieren

lib/lib.h

struct s1 {
    int a;
    char *b;
};

void printc(char *str, int *t);
void f32_123(struct s1 *s);
Nach dem Login kopieren

Fehler beim Kompilieren

/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: /tmp/go-link-3024881602/000001.o: in function _cgo_cf24297edd23_Cfunc_f32_123': /tmp/go-build/cgo-gcc-prolog:49: undefined reference to f32_123'
collect2: error: ld returned 1 exit status
Nach dem Login kopieren

Ich hatte erwartet, dass der Code erfolgreich kompiliert werden würde, aber irgendwie war das nicht der Fall. Wenn ich die Dokumentation richtig gelesen habe, muss ich die Dateien lib.clib.hmain.go und

im selben Verzeichnis speichern. Aber ich bin mir nicht sicher, ob das möglich ist oder ob ich etwas falsch mache.
  • Wenn ich beispielsweise alle Dateien im selben Verzeichnis speichere, ist die Kompilierung erfolgreich.
  • lib.clib.hWenn ich

    in einem Unterverzeichnis behalte, schlägt die Kompilierung fehl
  • f32_123 ,那么编译也会成功,这很奇怪,这就是打开此错误的原因,以更好地理解为什么在 lib.h 时编译不会出现 printc 函数问题并且 lib.cWenn ich eine Funktion aus main.go

    entferne, die sich in einem Unterverzeichnis befindet.

Workaround

Zuallererst hat @jimb vor einiger Zeit diese akzeptierte Antwort gegeben: https://www.php.cn/link/50c57f7019bb52cfbebdfe5bdc42b422go build bedeutet, dass das Erstellen eines Objekts oder einer Bibliothek in einem Unterverzeichnis nicht

etwas für Sie ist kann Dinge tun.

Angenommen, Sie haben die folgende Struktur:

lib/
lib/lib.c
lib/lib.h
main.go
Nach dem Login kopieren

Hier sind einige einfachere Dateien zur Verdeutlichung:

/* lib/lib.h */
struct foo {
    int x;
};
void show(struct foo *arg);
Nach dem Login kopieren
/* lib/lib.c */
#include <stdio.h>
#include "lib.h"
void show(struct foo *arg) {
    printf("[%d]\n", arg->x);
}
Nach dem Login kopieren
main.go ,则可以从 go build main.goWenn Sie also

so haben, können Sie alles von go build main.go erstellen:

package main

// #cgo cflags: -i${srcdir}/lib
// #include "lib.c"
import "c"

func main() {
    x := c.struct_foo{ x: 42 }
    c.show(&x)
}
Nach dem Login kopieren
#include 库的“c”源代码(隐式导入 lib/lib.hDas funktioniert, weil wir tatsächlich den „c“-Quellcode der Bibliothek #include (und damit implizit die

-Datei importieren).

Für komplexere Bibliotheken müssen Sie diese jedoch möglicherweise als separate, normalere C-Toolchains erstellen. Schritte vor dem Erstellen:

$ cd lib
$ cc -c lib.c
$ ar cr libx.a lib.o
$ cd ..
Nach dem Login kopieren
main2.goDann verwenden Sie verschiedene Go-Dateien:

: 🎜
package main

// #cgo CFLAGS: -I${SRCDIR}/lib
// #cgo LDFLAGS: -L${SRCDIR}/lib -lx
// #include "lib.h"
import "C"

func main() {
    x := C.struct_foo{ x: 42 }
    C.show(&x)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonKann nicht mit cgo kompiliert werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage