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

Kann nicht mit cgo kompiliert werden

WBOY
WBOYnach vorne
2024-02-09 16:21:091158Durchsuche

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

Projektstruktur:

directory structure --
example --> main.go
        -->lib
            lib.c
            lib.h

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))
}

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);
}

lib/lib.h

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

void printc(char *str, int *t);
void f32_123(struct s1 *s);

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

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: a>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

Hier sind einige einfachere Dateien zur Verdeutlichung:

/* lib/lib.h */
struct foo {
    int x;
};
void show(struct foo *arg);
/* lib/lib.c */
#include <stdio.h>
#include "lib.h"
void show(struct foo *arg) {
    printf("[%d]\n", arg->x);
}
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)
}
#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 ..
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)
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen