go调用c/c++ 示例

2021/12/18 20:52:11

本文主要是介绍go调用c/c++ 示例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

调用纯c,可以直接把代码嵌入go,

如果是c++,笔者没有找到直接嵌入go的好方法

笔者找到可行的方法是,

把c++代码编译成动态库, 

再做一个纯c接口,调用相应的c++代码

对象(不管是struct还是class)统一用void* 代替,并提供接口设置对象的成员变量

库文件一定要以 libxxx.so  libxxx.dll这个的方式命名(go是linux style)

示例代码如下(以vsstudio为例,linux下面对应直接make生成.so即可)

c++ dll代码

dll导出要用.def的方式进行,如下

LIBRARY libtestdll
EXPORTS
TestDLLAdd
TestDLLSub

c++代码

// 头文件
#pragma once

class TestCpp
{
public:

	TestCpp();
	~TestCpp();

	void SayHello();
};


// cpp文件
#include "testcpp.h"
#include <stdio.h>

TestCpp::TestCpp()
{
	printf("i born\r\n");
}
TestCpp::~TestCpp()
{
	printf("see you\r\n");
}

void TestCpp::SayHello()
{
	printf("hello \r\n");
}

再用纯c封装一下

//头文件

#ifndef TEST_H
#define TEST_H

//extern "C" __declspec(dllexport) int TestDLLAdd(int a, int b);
//extern "C" __declspec(dllexport) int TestDLLSub(int a, int b);
int TestDLLAdd(int a, int b);
int TestDLLSub(int a, int b);

#endif


//cpp文件
#include "testdll.h"
#include "testcpp.h"

int TestDLLAdd(int a, int b)
{
	TestCpp tc;
	tc.SayHello();
	return a + b;
}
int TestDLLSub(int a, int b)
{
	return a - b;
}

在go代码中调用

如下

/*
#cgo CFLAGS: -Icpp
#cgo LDFLAGS: -Llib -ltestdll
#include "testdll.h"
*/
import "C"

func main() {
	fmt.Println(C.TestDLLAdd(41,22))
}

其中 -Icpp 表示.h文件所在目录是./cpp

-Llib表示对应的 libxxx.lib libxxx.dll所在的目录是 ./lib

运行之后就会是这样

 



这篇关于go调用c/c++ 示例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程