php小编百草在编写代码时,经常会遇到一些问题和挑战。其中一个常见的问题是在使用cgo编译时遇到错误信息"无法用cgo编译"。这个问题可能由于各种原因引起,例如缺少依赖库、环境配置不正确等。解决这个问题需要仔细检查代码和环境,并根据具体情况进行相应的调整和修复。在本文中,我们将分享一些解决这个问题的方法和技巧,帮助大家克服这个困扰。
您使用的 go 版本(go 版本)?
$ go version go version go1.20.2 linux/amd64
项目结构:
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);
编译时出错
/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
我期望代码能够成功编译,但不知怎的却没有。如果我正确阅读了文档,那么我必须将 lib.c
和 lib.h
与 main.go
与
lib.c
和 lib.h
如果我将
f32_123
,那么编译也会成功,这很奇怪,这就是打开此错误的原因,以更好地理解为什么在 lib.h
时编译不会出现 printc 函数问题并且 lib.c
如果我从 main.go 中删除一个函数
鉴于此,假设您具有以下结构:
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
因此,如果您有这样的 ,则可以从 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) }
#include
库的“c”源代码(隐式导入 lib/lib.h
之所以有效,是因为我们实际上 #include
库的“c”源代码(隐式导入 文件)。但是,对于更复杂的库,您可能需要将它们构建为单独的、更正常的 c 工具链,预构建步骤:
$ cd lib $ cc -c lib.c $ ar cr libx.a lib.o $ cd ..
main2.go
然后使用不同的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) }
以上是无法用cgo编译的详细内容。更多信息请关注PHP中文网其他相关文章!