文件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();

}

}

有疑问加站长微信联系(非本文作者)