赞
踩
本例提供了cgo调用C函数的示例,也演示了如何将C函数打印内容保存到golang的变量中
admin@hpc-1:~/go/my_stdout$ tree
.
├── include
│ ├── mylibrary.c
│ └── mylibrary.h
├── lib
└── main.go
2 directories, 3 files
admin@hpc-1:~/go/my_stdout$
admin@hpc-1:~/go/my_stdout$ cat include/mylibrary.c
#include <stdio.h>
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_H
void writeToStdout();
#endif
admin@hpc-1:~/go/my_stdout$
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 <stdio.h> */ 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 <- b.Bytes() }() // 调用C函数打印 C.writeToStdout() // 一些清理工作 C.fflush(nil) writer.Close() syscall.Close(syscall.Stdout) // 导出output record := <-out // Restore original Stdout. syscall.Dup2(origStdout, syscall.Stdout) syscall.Close(origStdout) fmt.Println("Captured:", string(record)) } admin@hpc-1:~/go/my_stdout$
admin@hpc-1:~/go/my_stdout$ gcc -shared -o ./lib/libmyprint.so include/mylibrary.c
admin@hpc-1:~/go/my_stdout$
admin@hpc-1:~/go/my_stdout$ ls -lt ./lib/
total 16
-rwxrwxr-x 1 centec centec 16208 2-р сар 27 07:29 libmyprint.so
admin@hpc-1:~/go/my_stdout$
Captured:
后面就是获取的C函数打印的显示内容admin@hpc-1:~/go/my_stdout$ go run main.go
Captured: Hello from C!
admin@hpc-1:~/go/my_stdout$
import "C"
上面紧挨的被注释的部分,就是和C有关的信息#cgo CFLAGS: -I./include
指定C源码和头文件所在目录-L${SRCDIR}/lib
指定C编程的lib文件所在目录-lmyprint
其中-l的后面,是lib文件名(‘libmyprint.so’)去掉开头的’lib’后最后的’.so’之后的部分-rpath=${SRCDIR}/lib
指定了程序运行时候,到哪里去找lib文件,也就是说运行该程序的地方,一定要有用到的.so文件Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。