MST

星途 面试题库

面试题:Go语言中如何创建和调用简单的动态库

请描述在Go语言中创建一个包含简单加法函数的动态库,并在另一个Go程序中调用该动态库函数的步骤。需要详细说明构建动态库的命令、导出函数的方式以及调用动态库函数的代码结构。
31.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

创建包含加法函数的动态库

  1. 编写Go代码: 创建一个文件,例如 add.go,内容如下:

    // add.go
    package main
    
    //export Add
    func Add(a, b int) int {
        return a + b
    }
    

    这里使用 //export Add 注释来导出 Add 函数,以便外部程序可以调用。

  2. 构建动态库: 在命令行中执行以下命令构建动态库:

    go build -buildmode=c-shared -o add.dll add.go
    
    • -buildmode=c-shared 表示构建C共享库格式的动态库,在Windows下生成 .dll 文件,在Linux下生成 .so 文件。
    • -o add.dll 指定输出的动态库文件名,在Linux下应改为 -o add.so

在另一个Go程序中调用动态库函数

  1. 创建调用程序: 创建一个新的Go文件,例如 main.go,内容如下:

    package main
    
    /*
    #cgo LDFLAGS: -L. -ladd
    #include "add.h"
    #cgo windows LDFLAGS: -Wl,--kill-at
    #cgo darwin LDFLAGS: -undefined dynamic_lookup
    */
    import "C"
    import (
        "fmt"
    )
    
    func main() {
        a := 3
        b := 5
        result := int(C.Add(C.int(a), C.int(b)))
        fmt.Printf("The result of %d + %d is %d\n", a, b, result)
    }
    
    • #cgo LDFLAGS: -L. -ladd:指定链接器在当前目录(-L.)查找名为 add 的库(-ladd)。
    • #include "add.h":引入由Go生成的C头文件,该头文件包含导出函数的声明。
    • 不同操作系统下可能需要额外的链接标志,如 #cgo windows LDFLAGS: -Wl,--kill-at#cgo darwin LDFLAGS: -undefined dynamic_lookup
  2. 运行调用程序: 在命令行中执行以下命令运行程序:

    go run main.go
    

    程序将会调用动态库中的 Add 函数并输出结果。