行业知识
通过一个例子演示golang调用C语言动态链接库中的函数
2026-11-01 08:09:31
来源:互联网转载
���例提供了cgo调用C函数的示例,也演示了如何将C函数打印内容保存到golang的变量中
()目录和源码
- 目录结构
admin@hpc-1:~/go/my_stdout$ tree.├── include│ ├── mylibrary.c│ └── mylibrary.h├── lib└── main.go2 directories, 3 filesadmin@hpc-1:~/go/my_stdout$
- include目录下放C的源码和头文件
admin@hpc-1:~/go/my_stdout$ cat include/mylibrary.c#include void writeToStdout() { printf("Hello from C!\n");}admin@hpc-1:~/go/my_stdout$ admin@hpc-1:~/go/my_stdout$ cat include/mylibrary.h#ifndef MYLIBRARY_H#define MYLIBRARY_Hvoid writeToStdout();#endifadmin@hpc-1:~/go/my_stdout$- golang的源码
admin@hpc-1:~/go/my_stdout$ cat main.go package main/*#cgo CFLAGS: -I./include#cgo LDFLAGS: -L${SRCDIR}/lib -lmyprint -Wl,-rpath=${SRCDIR}/lib #include "mylibrary.h"#include */import "C"import ( "syscall" "bytes" "log" "fmt" "io" "os")func main() { // 克隆 Stdout 到 origStdout. origStdout, err := syscall.Dup(syscall.Stdout) if err != nil { log.Fatal(err) } // 创建管道 reader, writer, err := os.Pipe() if err != nil { log.Fatal(err) } // 此后stdout将会写到writer if err = syscall.Dup2(int(writer.Fd()), syscall.Stdout); err != nil { log.Fatal(err) } // 启动背景 goroutine 收集输出 out := make(chan []byte) go func() { var b bytes.Buffer io.Copy(&b, reader) out
- golang的源码
- include目录下放C的源码和头文件
下一篇:服务器链接不通怎么办?