猿问

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

考虑以下几点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 +0x90

runtime.sigpanic()

 /usr/lib/golang/src/runtime/sigpanic_unix.go:12 +0x5a

runtime.mHeap_Grow(0x6c7c20, 0x8, 0x0)

 /usr/lib/golang/src/runtime/mheap.go:647 +0x243

runtime.mHeap_AllocSpanLocked(0x6c7c20, 0x1, 0x0)

 /usr/lib/golang/src/runtime/mheap.go:532 +0x5f1

runtime.mHeap_Alloc_m(0x6c7c20, 0x1, 0x15, 0x0)

 /usr/lib/golang/src/runtime/mheap.go:425 +0x1ac

runtime.mHeap_Alloc.func1()

 /usr/lib/golang/src/runtime/mheap.go:484 +0x41

runtime.systemstack(0x7ffcb3aab958)

 /usr/lib/golang/src/runtime/asm_amd64.s:278 +0xab

runtime.mHeap_Alloc(0x6c7c20, 0x1, 0x10000000015, 0x40a954)

 /usr/lib/golang/src/runtime/mheap.go:485 +0x63

runtime.mCentral_Grow(0x6d0898, 0x0)

 /usr/lib/golang/src/runtime/mcentral.go:190 +0x93

runtime.mCentral_CacheSpan(0x6d0898, 0x6c1180)

 /usr/lib/golang/src/runtime/mcentral.go:86 +0x4d4

runtime.mCache_Refill(0x7fbc9971d050, 0x15, 0x40ca28)

 /usr/lib/golang/src/runtime/mcache.go:118 +0xcf

runtime.mallocgc.func2()

 /usr/lib/golang/src/runtime/malloc.go:611 +0x2b

runtime.systemstack(0x7ffcb3aabb28)

 /usr/lib/golang/src/runtime/asm_amd64.s:278 +0xab

runtime.mallocgc(0x180, 0x476220, 0x0, 0x800000000)

 /usr/lib/golang/src/runtime/malloc.go:612 +0x842

runtime.newobject(0x476220, 0x6c0c40)

 /usr/lib/golang/src/runtime/malloc.go:760 +0x42

runtime.malg(0x8000, 0x6c0e40)

 /usr/lib/golang/src/runtime/proc1.go:2188 +0x27

runtime.mpreinit(0x6c1180)

 /usr/lib/golang/src/runtime/os1_linux.go:197 +0x1f


翻过高山走不出你
浏览 189回答 1
1回答

BIG阳

使用时我得到相同的结果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 herecollect2: 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任何内容即可。
随时随地看视频慕课网APP

相关分类

Go
我要回答