为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用cgo用argv包装C“hello world”?

如何使用cgo用argv包装C“hello world”?

Go
翻过高山走不出你 2021-11-15 17:17:39
考虑以下几点hello.c:#include <stdio.h>int main(int argc, char* argv[]) {    printf("Hello, world! argv[0]=%s\n", argv[0]);}Makefile 只包含一行:all: hello. 我如何围绕 Go 程序包装(和编译)这个函数,就像在这个(非工作)示例中一样?package main// int main(int argc, char* argv[]);import "C"func main() {argc := C.int(1);argv := make([]*C.char, 1)argv[0] = C.CString("hai");C.main(argc, &argv[0])}我得到的错误是:(virtualenv)[14:16:21][/tmp/cgo]$ ./main fatal error: unexpected signal during runtime execution[signal 0xb code=0x1 addr=0x1c000000000 pc=0x41d563]runtime stack:runtime.throw(0x48b400, 0x2a) /usr/lib/golang/src/runtime/panic.go:527 +0x90runtime.sigpanic() /usr/lib/golang/src/runtime/sigpanic_unix.go:12 +0x5aruntime.mHeap_Grow(0x6c7c20, 0x8, 0x0) /usr/lib/golang/src/runtime/mheap.go:647 +0x243runtime.mHeap_AllocSpanLocked(0x6c7c20, 0x1, 0x0) /usr/lib/golang/src/runtime/mheap.go:532 +0x5f1runtime.mHeap_Alloc_m(0x6c7c20, 0x1, 0x15, 0x0) /usr/lib/golang/src/runtime/mheap.go:425 +0x1acruntime.mHeap_Alloc.func1() /usr/lib/golang/src/runtime/mheap.go:484 +0x41runtime.systemstack(0x7ffcb3aab958) /usr/lib/golang/src/runtime/asm_amd64.s:278 +0xabruntime.mHeap_Alloc(0x6c7c20, 0x1, 0x10000000015, 0x40a954) /usr/lib/golang/src/runtime/mheap.go:485 +0x63runtime.mCentral_Grow(0x6d0898, 0x0) /usr/lib/golang/src/runtime/mcentral.go:190 +0x93runtime.mCentral_CacheSpan(0x6d0898, 0x6c1180) /usr/lib/golang/src/runtime/mcentral.go:86 +0x4d4runtime.mCache_Refill(0x7fbc9971d050, 0x15, 0x40ca28) /usr/lib/golang/src/runtime/mcache.go:118 +0xcfruntime.mallocgc.func2() /usr/lib/golang/src/runtime/malloc.go:611 +0x2bruntime.systemstack(0x7ffcb3aabb28) /usr/lib/golang/src/runtime/asm_amd64.s:278 +0xabruntime.mallocgc(0x180, 0x476220, 0x0, 0x800000000) /usr/lib/golang/src/runtime/malloc.go:612 +0x842runtime.newobject(0x476220, 0x6c0c40) /usr/lib/golang/src/runtime/malloc.go:760 +0x42runtime.malg(0x8000, 0x6c0e40) /usr/lib/golang/src/runtime/proc1.go:2188 +0x27runtime.mpreinit(0x6c1180) /usr/lib/golang/src/runtime/os1_linux.go:197 +0x1f
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

使用时我得到相同的结果go run main.go,但使用时go build .,您会得到更好的错误:


/tmp/go-build887090083/cgoSO/_obj/hello.o: In function `main':

/usr/include/x86_64-linux-gnu/bits/stdio2.h:104: multiple definition of `main'

/tmp/go-build887090083/cgoSO/_obj/_cgo_main.o:/tmp/go-build887090083/cgoSO/_obj/_cgo_main.c:1: first defined here

collect2: error: ld returned 1 exit status

然后我添加了-work标志以go build保留 tmp 工作区,这是以下内容/tmp/go-build465152107/cgoSO/_obj/_cgo_main.c:


int main() { return 0; }

void crosscall2(void(*fn)(void*, int), void *a, int c) { }

void _cgo_wait_runtime_init_done() { }

char* _cgo_topofstack(void) { return (char*)0; }

void _cgo_allocate(void *a, int c) { }

void _cgo_panic(void *a, int c) { }

void _cgo_reginit(void) { }

第一行写在那里:https : //github.com/golang/go/blob/f2e4c8b5fb3660d793b2c545ef207153db0a34b1/src/cmd/cgo/out.go#L49


并且没有条件,所以无法避免。


结论:您不能导入 C 程序,您只能导入库(这实际上是有道理的)。


如果 C 是您的代码,那么只需更改其他main任何内容即可。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信