Go调用C/C++

栏目: C++ · 发布时间: 7年前

内容简介:golang是类C的语言 支持调用C接口(不支持调用C++)Go调用C/C++的方式 :test.cpp和test.h是C++接口的实现

cgo

golang是类C的语言 支持调用C接口(不支持调用C++)

Go调用C/C++的方式 :

  1. C : 直接调用C API
  2. C++ : 通过实现一层封装的C接口来调用C++接口

Go集成C/C++的方式

  1. go的源代码中直接声明C代码

    比较简单的应用情况 可以直接使用这种方法 C代码直接写在 go 代码的注释中

    注释之后紧跟import "C" 通过C.xx来引用C的结构和函数

package main

/*
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
}ctx;

ctx *createCtx(int id) {
    ctx *obj = (ctx *)malloc(sizeof(ctx));
    obj->id = id;
    return obj;
}
*/
import "C"
import (
    "fmt"
    "sync"
)

func main() {
    var ctx *C.ctx = C.createCtx(100)
    fmt.Printf("id : %d\n", ctx.id)
}
  1. 通过封装实现调用C++接口

    目录结构 :C++代码放置在cpp目录下

    C++代码需要提前编译成动态库(拷贝到系统库目录可以防止go找不到动态库路径),go程序运行时会去链接

.
├── cpp
│   ├── cwrap.cpp
│   ├── cwrap.h
│   ├── libgotest.dylib
│   ├── test.cpp
│   └── test.h
├── main.go

test.cpp和test.h是C++接口的实现

cwrap.h和cwrap.cpp是封装的C接口的实现

  1. test.h
#ifndef __TEST_H__
#define __TEST_H__

#include <stdio.h>

class Test {
public:
    void call();
};

#endif
  1. test.cpp
#include "test.h"

void Test::call() {
    printf("call from c++ language\n");
}
  1. cwrap.cpp
#include "cwrap.h"
#include "test.h"

void call() {
    Test ctx;
    ctx.call();
}
  1. cwrap.h
#ifndef __CWRAP_H__
#define __CWRAP_H__

#ifdef __cplusplus
extern "C" {
#endif
void call();

#ifdef __cplusplus
}
#endif

#endif
  1. main.go
package main

/*
#cgo CFLAGS: -Icpp

#cgo LDFLAGS: -lgotest

#include "cwrap.h"
*/
import "C"

func main() {
    C.call()
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Book of CSS3

The Book of CSS3

Peter Gasston / No Starch Press / 2011-5-13 / USD 34.95

CSS3 is the technology behind most of the eye-catching visuals on the Web today, but the official documentation can be dry and hard to follow. Luckily, The Book of CSS3 distills the heady technical la......一起来看看 《The Book of CSS3》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具