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.
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.c
和 lib.h
与 main.go
und
lib.c
和 lib.h
Wenn ich
f32_123
,那么编译也会成功,这很奇怪,这就是打开此错误的原因,以更好地理解为什么在 lib.h
时编译不会出现 printc 函数问题并且 lib.c
Wenn ich eine Funktion aus main.go
Angenommen, Sie haben die folgende Struktur:
lib/ lib/lib.c lib/lib.h main.go
/* 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.go
Wenn 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.h
Das 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.go
Dann 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!