Go 使用 -linkshared 构建共享库程序时,必须确保导入路径与 go install -buildmode=shared 安装的包路径严格一致;常见错误是误用简短包名(如 libmath),而实际应使用完整导入路径(如 effe/libmath)。
go 使用 `-linkshared` 构建共享库程序时,必须确保导入路径与 `go install -buildmode=shared` 安装的包路径严格一致;常见错误是误用简短包名(如 `libmath`),而实际应使用完整导入路径(如 `effe/libmath`)。
在 Go 中启用动态链接(shared library)需同时满足编译、链接与运行时三方面约束。你遇到的 cannot find package "libmath" 错误,并非 Go 找不到源码,而是 Go 的 import path 解析机制未匹配到已安装的共享包。
根本原因在于:Go 的 import "libmath" 语句要求该包位于 $GOPATH/src/libmath/ 或 $GOROOT/src/libmath/ 下,但你的 libmath.go 实际位于 src/effe/libmath/ 目录中——因此其合法且唯一的导入路径是 "effe/libmath",而非 "libmath"。
✅ 正确做法如下:
-
修正导入语句(src/effe/prova/prova.go):
package main
import ( "fmt" "effe/libmath" // ← 关键修改:使用完整路径 )
func main() { fmt.Printf("5 op 10 => %d\n", libmath.Sum(5, 10)) }
2. **确保共享构建流程完整**(按顺序执行): ```bash # 1. 构建并安装共享库(生成 .so 和 .a) go install -buildmode=shared -linkshared effe/libmath # 2. 构建主程序(依赖已安装的共享库) go build -linkshared -o app effe/prova
⚠️ 注意事项:
- -buildmode=shared 会将指定包及其所有依赖编译为共享对象(.so),并生成对应静态存根(.a)供链接器使用;它不会自动“注册”简写包名。
- go install -buildmode=shared 必须作用于完整导入路径(如 effe/libmath),且后续 import 语句必须完全一致。
- 共享构建对 Go 版本和平台敏感:仅支持 Linux(linux/amd64, linux/arm64 等),且要求 Go 1.10+;macOS 和 Windows 不支持 -linkshared。
- 运行生成的二进制前,请确保 LD_LIBRARY_PATH 包含 $(go env GOPATH)/pkg/linux_amd64_dynlink(或对应平台目录),否则会报 libeffe-libmath.so: cannot open shared object file。
? 验证是否成功安装共享库:
ls $(go env GOPATH)/pkg/linux_amd64_dynlink/effe/ # 应输出:libmath.a libmath.shlibname ls $(go env GOPATH)/pkg/linux_amd64_dynlink/ # 应包含:libeffe-libmath.so
? 总结:Go 的包管理以文件系统路径即导入路径为设计原则,共享库模式不改变这一规则。切勿为图方便省略路径前缀;建议先用标准模式(go build)验证逻辑正确性,再升级至 -linkshared 模式优化部署体积与复用性。











