golang新版本对于cgo支持的一个坑
发布时间:2020-12-16 18:58:34 所属栏目:大数据 来源:网络整理
导读:文件test.h如下 #ifndef _TEST_H#define _TEST_H#ifdef __cplusplusextern "C" {#endifextern void myTest();#ifdef __cplusplus}#endif#endif 文件test.cc如下 #include "_cgo_export.h"extern "C" {void myTest() {test();}} 文件test.go如下 package test
文件test.h如下 #ifndef _TEST_H #define _TEST_H #ifdef __cplusplus extern "C" { #endif extern void myTest(); #ifdef __cplusplus } #endif #endif 文件test.cc如下 #include "_cgo_export.h" extern "C" { void myTest() { test(); } } 文件test.go如下 package test /* #include "test.h" */ import "C" import () func Test() { C.myTest() } //export test func test() { println("hello") } 如果执行go build -x则会有如下结果 WORK=/tmp/go-build845372545 mkdir -p $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ mkdir -p $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/ cd /home/pirate/programs/goclipse/workspace/v8/src/test /home/pirate/programs/go/pkg/tool/linux_amd64/cgo -objdir $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -- -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ test.go /home/pirate/programs/go/pkg/tool/linux_amd64/6c -F -V -w -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -I /home/pirate/programs/go/pkg/linux_amd64 -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_defun.6 -D GOOS_linux -D GOARCH_amd64 $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_defun.c gcc -I . -g -O2 -fPIC -m64 -pthread -print-libgcc-file-name gcc -I . -g -O2 -fPIC -m64 -pthread -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_main.o -c $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_main.c gcc -I . -g -O2 -fPIC -m64 -pthread -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_export.o -c $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_export.c gcc -I . -g -O2 -fPIC -m64 -pthread -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.cgo2.o -c $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.cgo2.c gcc -I . -g -O2 -fPIC -m64 -pthread -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.o -c ./test.c g++ -I . -g -O2 -fPIC -m64 -pthread -I $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/ -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.cc.o -c ./test.cc g++ -I . -g -O2 -fPIC -m64 -pthread -o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_.o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_main.o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/_cgo_export.o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.cgo2.o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.o $WORK/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.cc.o # _/home/pirate/programs/goclipse/workspace/v8/src/test /tmp/go-build845372545/_/home/pirate/programs/goclipse/workspace/v8/src/test/_obj/test.cc.o: In function `myTest': ./test.cc:6: undefined reference to `test()' collect2: error: ld returned 1 exit status 这里可以看到是test.cc是用g++来编译的,但是test函数的声明是在_cgo_export.c里,声明是在_cgo_export.h里,g++编译的时候肯定会找不到这个函数,但是只需要一个小修改就可以解决问题,即把include "_cgo_export.h"移到extern "C"里去,最终如下 extern "C" { #include "_cgo_export.h" void myTest() { test(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |