参考: https://gist.github.com/geraldstanje
首先编写go代码, 保存并命名为 test.go
, 代码如下
package main
import "C"
import (
"sort"
"fmt"
)
//export Add
func Add(a, b int) int {
return a + b
}
//export Sub
func Sub(a, b int) int {
return a - b
}
//export Print
func Print(str string) {
fmt.Printf("Go prints: %s\n", str)
}
func strFxn(input string) string {
return "Hello " + input + " World"
}
//export StrFxn
func StrFxn(cinput *C.char) *C.char {
// C data needs to be manually managed in memory.
// But we will do it from C++.
input := C.GoString(cinput)
return C.CString(strFxn(input))
}
//export Sort
func Sort(vals []int) {
sort.Ints(vals)
}
func main() {
// We need the main function to make possible
// CGO compiler to compile the package as C shared library
}
注意其中的 //export Add
等代码不可以省略.
编写 C++ 代码并保存命名为 main.cpp
, 代码如下:
#include <iostream>
#include <string>
#include "test.h"
#include <cstring>
int main() {
int res = Add(1, 2);
std::cout << res << std::endl;
GoString str;
str.p = "Hello World";
str.n = strlen(str.p);
Print(str);
std::string s = "Bidder";
char *cstr = new char[s.length()+1];
std::strcpy (cstr, s.c_str());
cstr = StrFxn(cstr);
std::cout << cstr << std::endl;
delete[] cstr;
return 0;
}
以windows平台编译为例, 以静态链接库的形式编译:
go build -o test.a -buildmode=c-archive test.go
g++ main.cpp test.a -o main
以静态链接库的形式编译:
go build -o test.dll -buildmode=c-shared test.go
g++ main.cpp test.dll -o main