在mac环境下,使用cgo实现golang调用c++的动态链接库。
1.配置环境变量 DYLD_LIBRARY_PATH 用以存放 .dylib文件

2.写一个dll文件
library.h

#ifndef CPP_TEST_LIBRARY_H
#define CPP_TEST_LIBRARY_H

#ifdef __cplusplus
#define C_API extern "C"
#else
#define C_API
#endif

typedef int ( *Cbf )(int a);

C_API void hello();

C_API int create(Cbf);

C_API int connect();

#endif //CPP_TEST_LIBRARY_H

library.cpp

#include "library.h"

#include <future>
#include <iostream>

Cbf cbfImpl;

void hello() {
    std::cout << "Hello, World!" << std::endl;
}

int create(Cbf cbf){
    cbfImpl = cbf;
    return 1;
}

[[noreturn]] void f(int a){
    while (true){
        cbfImpl(a);
    }
}

int connect(){
    std::async(f,1);
    return 1;
}

生成 dylib文件 复制到 DYLD_LIBRARY_PATH 指定的文件夹下。

3.将.h文件复制到golang工程下
写一个cppLib.go

package main

//#cgo CFLAGS: -I .
//#cgo LDFLAGS: -L${SRCDIR} -lcpp_test -lstdc++
//
//#include "library.h"
//void cbfCallback();
import "C"
import "fmt"

func Hello() {
   C.hello()
}

func Create() {
   C.create(C.Cbf(C.cbfCallback))
}

func Connect() {
   C.connect()
}

//export cbfCallback
func cbfCallback(a C.int) {
   Cbk(int32(a))
}

func Cbk(a int32) {
   fmt.Print(a)
}

调用

package main

func main() {
   Hello()
   Create()
   Connect()
}

控制台打印如下

Hello, World!
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111