Golang中如何创建共享库并让ldd输出静态链接结果
Golang中如何创建共享库并让ldd输出静态链接结果
我想在Go语言中创建一个共享库,当我们尝试使用ldd soname.so命令时,输出结果应为"statically linked"。
能否建议如何构建共享库以获得此输出。
1 回复
更多关于Golang中如何创建共享库并让ldd输出静态链接结果的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中创建共享库并让ldd输出"statically linked"的关键是使用-ldflags="-s -w -linkmode=external -extldflags=-static"构建标志。以下是具体实现方法:
// 创建共享库的示例代码
package main
import "C"
//export Add
func Add(a, b int) int {
return a + b
}
func main() {
// 共享库不需要main函数执行逻辑
}
构建命令:
# 设置CGO_ENABLED=1并使用静态链接标志
CGO_ENABLED=1 go build -buildmode=c-shared -o libexample.so \
-ldflags="-s -w -linkmode=external -extldflags=-static" \
main.go
验证结果:
$ ldd libexample.so
statically linked
重要说明:
- 必须启用CGO:
CGO_ENABLED=1是必需的,因为纯Go构建默认使用内部链接器 - 链接模式设置:
-linkmode=external强制使用外部链接器 - 静态链接标志:
-extldflags=-static指示外部链接器进行静态链接 - 依赖处理:确保系统安装了静态C库(如
libc.a)
如果遇到链接错误,可能需要安装静态库:
# Ubuntu/Debian
sudo apt-get install libc6-dev
# 或者明确安装静态版本
sudo apt-get install libc6-dev-static
这种方法生成的共享库会将所有依赖静态链接,因此ldd会显示"statically linked"。注意这会显著增加文件大小,因为所有依赖都被包含在单个文件中。

