go构建共享库时出现“cannot find package”错误,根本原因是导入路径未按模块结构正确声明,应使用完整子目录路径(如effe/libmath)而非简写包名(如libmath)。
go构建共享库时出现“cannot find package”错误,根本原因是导入路径未按模块结构正确声明,应使用完整子目录路径(如effe/libmath)而非简写包名(如libmath)。
在 Go 中,import 语句的路径必须与代码在 $GOPATH/src/(或 Go Modules 下的模块路径)中的实际目录结构严格匹配。你当前的项目结构为:
$GOPATH/src/effe/libmath/libmath.go → 包定义为 `package libmath` $GOPATH/src/effe/prova/prova.go
因此,prova.go 中正确的导入语句应为:
import "effe/libmath"
而非:
import "libmath" // ❌ 错误:Go 不支持“裸包名”导入,无全局命名空间
修正步骤如下:
立即学习“go语言免费学习笔记(深入)”;
-
修改 src/effe/prova/prova.go:
package main import ( "fmt" "effe/libmath" // ✅ 使用完整导入路径 ) func main() { fmt.Printf("5 op 10 => %d\n", libmath.Sum(5, 10)) } -
确保已成功构建并安装共享库:
go install -buildmode=shared -linkshared effe/libmath
此命令会生成 libeffe-libmath.so 并将 libmath.a 和 .shlibname 文件放入 pkg/linux_amd64_dynlink/ 目录(如你所示),这是共享链接的前提。
-
使用 -linkshared 构建主程序:
go build -linkshared -o app effe/prova
✅ 成功后,app 将动态链接到 libeffe-libmath.so,运行时需确保该 .so 文件在系统库路径中(如通过 LD_LIBRARY_PATH 指定):
LD_LIBRARY_PATH=$GOPATH/pkg/linux_amd64_dynlink:$LD_LIBRARY_PATH ./app
⚠️ 重要注意事项:
- Go 的共享库模式(-buildmode=shared / -linkshared)仅适用于 Go 1.10+ 且要求所有参与共享的包均用同一 Go 工具链构建;不兼容跨版本或混合静态/动态依赖。
- 强烈建议先用标准模式(go build effe/prova)验证逻辑正确性,再启用共享构建——这能快速暴露路径、依赖或初始化问题。
- 自 Go 1.16 起,$GOPATH 模式已逐步被 Go Modules 取代;若迁移到模块化项目,需在 effe/libmath 目录下运行 go mod init effe/libmath,并在 prova 中通过 require 声明依赖,但注意:Go Modules 与 -buildmode=shared 当前不完全兼容,仍推荐在 $GOPATH 环境下使用共享构建。
总结:Go 没有“包注册中心”,导入路径即文件系统路径。牢记 import "x/y" 必须对应 $GOROOT/src/x/y/ 或 $GOPATH/src/x/y/ —— 这是解决此类问题的唯一核心原则。


















