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
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"
具体说明:
- 路径指定:使用
-L指定库文件所在目录的完整路径 - 库名指定:使用
-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验证库文件是否完整且与系统架构兼容。

