go程序中如何调用c++代码生成的so文件,传递double数组参数(go传递数组给C++,double类型)

本文介绍了如何在Go程序中调用C++编写的函数,详细步骤包括编写C++源文件、声明头文件、生成共享库以及在Go中进行调用。特别强调了Go传递数组参数给C++的方式,通过创建C.double类型的切片并利用unsafe.Pointer转换来实现。此外,还展示了如何配置Go程序以正确链接和查找.so文件。
摘要由CSDN通过智能技术生成

1、编写你的XXX.cpp文件,实现你的业务功能;

     供go调用的函数是   void CalcTeam(double arr1[], int arr1len, double arr2[], double *ret, int retlen)

     注意使用

     extern "C" {

            你要暴露出去的函数,就是上面的CalcTeam

            void CalcTeam(double arr1[], int arr1len, double arr2[], double *ret, int retlen)

           {

           }

     }

2、编写aaaaaaaa.h声明文件;

   

#ifndef __AAAAAAAAA_H__
#define __AAAAAAAAA_H__

 void CalcTeam(double arr1[], int arr1len, double arr2[], double *ret, int retlen);

#endif

3、生成so文件

g++ XXX.cpp -fPIC -shared -o libxxx.so

4、添加go程序的main函数头(我将所有c相关的代码都放在了cpp目录下)

/*
#include "cpp/aaaaaaaa.h"
#cgo LDFLAGS: -ldl -L ./cpp -lxxx
*/
import "C"

上面这个头声明很重要,第一行是引入.h文件,注意目录即可

第二行是让go的程序能够找到.so文件,所以需要指定目录,同时指定文件名称

 

5、编写go程序main函数

arr1 := make([]C.double, 7)
    arr2 := make([]C.double, 7)
    arr1 = []C.double{0.8, 0.9, 0.25, 0.6, 0.37, 0.87, 0.98}
    arr2 = []C.double{0.7, 0.2, 0.45, 0.5, 0.67, 0.23, 0.6}

    ret := make([]C.double, 3)
    C.CalcTeam((*C.double)(unsafe.Pointer(&arr1[0])), C.int(len(arr1)),
        (*C.double)(unsafe.Pointer(&arr2[0])), (*C.double)(unsafe.Pointer(&ret[0])), 3)

这里重点说一下,如何传递数组参数给c++。

因为c++中接收参数是一个double类型的数组,而go中没有double类型,

【go传递数组给C++,double类型】

arr1 := make([]C.double, 7)

arr1 = []C.double{0.8, 0.9, 0.25, 0.6, 0.37, 0.87, 0.98}

(*C.double)(unsafe.Pointer(&arr1[0]))   

 

【go传递整数给C++,int类型】

C.int(len(arr1))

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值