golang新版本對於cgo支持的一個坑

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

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章