package main
/*
#include <stdio.h>
int SayHello()
{
printf("success\n");
return 0;
}
*/
import "C"
import "fmt"
func main() {
ret := C.SayHello()
fmt.Println(ret)
}
__declspec(dllexport)
,但cpp实现中include头文件
也要有extern "C"
g++ .\Hello.cpp -fPIC -shared -o .\Hello.dll
package main
/*
#cgo CFLAGS: -I${SRCDIR}/include
#cgo LDFLAGS: -L${SRCDIR}/lib -lHello
#include "Hello.h"
*/
import "C"
import "fmt"
func main() {
ret := C.SayHello()
fmt.Println(ret)
}
链接
,等到运行的时候会找不到dll动态库
,所以还得自己加环境变量
或者把库放在可执行文件相同目录
。build再运行
,没法直接go run(总是说undefined reference)// cgotry.go
extern "C"
{
#include "Hello.h"
}
#include <iostream>
int SayHello()
{
std::cout << "success." << std::endl;
return 0;
}
-----------------------------------------------------
// Hello.h
#ifndef HELLO_H
#define HELLO_H
int SayHello();
#endif
------------------------------------------------------
// Hello.cpp
extern "C" // 如果不按c编译,会链接不上(符号名不能匹配上)
{
#include "Hello.h"
}
#include <iostream>
int SayHello()
{
std::cout << "success." << std::endl;
return 0;
}
对include头文件extern "C"
很关键,cgo支持的还是chttps://zhuanlan.zhihu.com/p/349197066