C/C++以链接库的形式调用Go代码

参考: 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值