Rumah >pembangunan bahagian belakang >Golang >Tidak dapat menyusun dengan cgo
editor php Baicao sering menghadapi beberapa masalah dan cabaran semasa menulis kod. Salah satu masalah biasa ialah menghadapi mesej ralat "Tidak boleh menyusun dengan cgo" semasa menyusun dengan cgo. Masalah ini mungkin disebabkan oleh pelbagai sebab, seperti perpustakaan bergantung yang hilang, konfigurasi persekitaran yang salah, dsb. Menyelesaikan masalah ini memerlukan pemeriksaan teliti kod dan persekitaran, dan membuat pelarasan dan pembetulan yang sesuai berdasarkan situasi tertentu. Dalam artikel ini, kami akan berkongsi beberapa kaedah dan teknik untuk menyelesaikan masalah ini untuk membantu semua orang mengatasi masalah ini.
Apakah versi go (versi go) yang anda gunakan?
$ go version go version go1.20.2 linux/amd64
Struktur projek:
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);
Ralat semasa menyusun
/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
Saya menjangkakan kod itu berjaya disusun, tetapi entah bagaimana ia tidak berjaya. Jika saya membaca dokumentasi dengan betul, saya perlu menyimpan fail lib.c
和 lib.h
与 main.go
dan
lib.c
和 lib.h
Jika saya menyimpan
f32_123
,那么编译也会成功,这很奇怪,这就是打开此错误的原因,以更好地理解为什么在 lib.h
时编译不会出现 printc 函数问题并且 lib.c
Jika saya mengalih keluar fungsi daripada main.go
Memandangkan ini, katakan anda mempunyai struktur berikut:
lib/ lib/lib.c lib/lib.h main.go
Berikut ialah beberapa fail yang lebih ringkas untuk menjelaskan perkara ini:
/* 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); }
Jadi jika anda mempunyai main.go
,则可以从 go build main.go
seperti ini, anda boleh membina segala-galanya daripada go build main.go
:
package main // #cgo cflags: -i${srcdir}/lib // #include "lib.c" import "c" func main() { x := c.struct_foo{ x: 42 } c.show(&x) }
Ini berfungsi kerana kami sebenarnya #include
kod sumber "c" pustaka (mengimport fail #include
库的“c”源代码(隐式导入 lib/lib.h
secara tersirat).
Namun, untuk perpustakaan yang lebih kompleks, anda mungkin perlu membinanya sebagai rantai alat c yang berasingan dan lebih biasa, langkah pra bina:
$ cd lib $ cc -c lib.c $ ar cr libx.a lib.o $ cd ..
Kemudian gunakan fail go yang berbeza: main2.go
:
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) }
Atas ialah kandungan terperinci Tidak dapat menyusun dengan cgo. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!