github.com/ebitengine/purego
https://blog.webp.se/golang-libvips-cgo-zh/
package main
import (
"fmt"
"github.com/ebitengine/purego"
"runtime"
)
func getSystemLibrary() string {
switch runtime.GOOS {
case "darwin":
return "/usr/lib/libSystem.B.dylib"
case "linux":
return "libc.so.6"
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
func getCustomLibrary() string {
switch runtime.GOOS {
case "darwin":
return "calc.dylib"
case "linux":
return "./calc.so" // 注意这里的 ./,否则就要 symbolic link 到 /lib
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
func main() {
libc, err := purego.Dlopen(getSystemLibrary(), purego.RTLD_NOW|purego.RTLD_GLOBAL)
if err != nil {
panic(err)
}
var timeFunc func() int64
purego.RegisterLibFunc(&timeFunc, libc, "time")
x := timeFunc()
fmt.Println("timeFunc from purego: ", x)
calc, err := purego.Dlopen(getCustomLibrary(), purego.RTLD_NOW|purego.RTLD_GLOBAL)
if err != nil {
panic(err)
}
var volumeFunc func(float64) float64
purego.RegisterLibFunc(&volumeFunc, calc, "volume")
res := volumeFunc(5.3)
fmt.Println("volumeFunc: ", res)
}
CGO_ENABLED=0 go build
CGO_ENABLED=0 go build
#include <stdio.h>
#include <math.h>
double volume(double radius)
{
double volume = (4.0f / 3.0f) * M_PI * pow(radius, 3);
printf("radius: %f, volume: %f\\n", radius, volume);
return volume;
}
type A interface {
Func() uintptr
}
type B struct {
f func() uintptr
}
func (b *B) Func() uintptr {
return b.f()
}
func re(f func() uintptr) A {
return &B{f}
}
func TestNameX(t *testing.T) {
var f func() uintptr
fmt.Println(re(f).Func())
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2022-08-03 zen
2021-08-03 docker swarm