小工具知识网

当前位置: 首页 > 行业知识 > 通过一个例子演示golang调用C语言动态链接库中的函数

行业知识

通过一个例子演示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 

上一篇:轻松学会游泳教学视频下载方法!一步步教程带你飞

下一篇:服务器链接不通怎么办?