在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