Golang中如何导入'.so'库

Golang中如何导入’.so’库 我正在尝试在Go项目中这样导入.so库:

// #cgo LDFLAGS: -L. -libcapi20.so
import "C"

但我遇到了这个错误:

/usr/bin/ld: cannot find -libcapi20.so
collect2: error: ld returned 1 exit status

我尝试将libcapi20.so放在不同的文件夹中,甚至放在usr/bin目录下。也尝试在"-L.“标志中写入.so文件的路径,还尝试去掉”.so"后缀。但每次都会出现同样的错误。

我的操作系统:Ubuntu 17.10。Go SDK:1.10版本,实际上在1.9版本中也会出现同样的错误。

如果我导入库的方式是正确的,那么我认为可能是Ubuntu版本不兼容或者.so文件已损坏。


更多关于Golang中如何导入'.so'库的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

froci9rgevka:

// #cgo LDFLAGS: -L. -libcapi20.so
import "C"

这应该写成:

// #cgo LDFLAGS: -L. -lcapi20
import "C"

更多关于Golang中如何导入'.so'库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中导入.so库时,你的#cgo LDFLAGS指令存在语法问题。错误cannot find -libcapi20.so表明链接器无法找到指定的库文件。

主要问题在于-l标志的用法不正确。正确的格式应该是-l后跟库名(去掉lib前缀和.so后缀),而不是完整的文件名。

以下是正确的导入方式:

// #cgo LDFLAGS: -L/path/to/library -lcapi20
import "C"

具体说明:

  1. 路径指定:使用-L指定库文件所在目录的完整路径
  2. 库名指定:使用-l指定库名(去掉lib前缀和.so后缀)

示例代码结构:

package main

/*
#cgo LDFLAGS: -L/home/user/libs -lcapi20
#include <stdlib.h>
// 声明C函数
void some_function_from_lib();
*/
import "C"
import (
    "fmt"
)

func main() {
    fmt.Println("调用.so库中的函数")
    C.some_function_from_lib()
}

如果库文件在当前目录,可以这样写:

// #cgo LDFLAGS: -L. -lcapi20

确保:

  • 库文件确实存在于指定路径
  • 库文件名为libcapi20.so(链接器会自动添加lib前缀和.so后缀)
  • 你有读取该库文件的权限

如果问题仍然存在,可以使用ldconfig -p | grep capi20检查系统是否能够识别该库,或者使用file libcapi20.so验证库文件是否完整且与系统架构兼容。

回到顶部