Ubuntu上Golang编译动态链接库方法
作者:SunnyJourney
时间:2026-07-16
来源:互联网
浏览:0
在Ubuntu上,通过cgo和`-buildmode=c-shared`将Go编译为`.so`动态库。需导入"C"并用`//export`导出函数,空main不可省略。编译后可用`dlsym`调用,支持导出复杂类型。
在Ubuntu上,如果你想用Go语言编译出动态链接库(也就是常见的`.so`文件),整个过程其实比想象中要直白。下面就把完整流程拆开讲清楚,每一步都附上代码,方便对照操作。

首先,确保你的系统里已经装好了Go。如果还没装,去Go官方网站下载对应Ubuntu版本的安装包,按提示装好就行,这里不再赘述。
接下来,新建一个Go文件,比如就叫`hello.go`,然后写入下面的代码。注意,这个例子虽然简单,但关键部分一个都不少:
```go
package main
import "C"
import (
"fmt"
)
//export Hello
func Hello() {
fmt.Println("Hello from Go!")
}
func main() {}
```
这里面有几个要点:`import "C"`是必须的,它启用了cgo机制;`//export Hello`这行注释告诉编译器,`Hello`函数需要被导出到生成的动态库中,少了它函数就露不出去;`main`函数虽然空着,但也不能省略,因为Go要求可执行包必须有`main`函数,编译成动态库时也一样。
接下来,用下面这条命令把Go代码编译成动态链接库:
```bash
go build -o libhello.so -buildmode=c-shared hello.go
```
执行完之后,当前目录下就会多出一个`libhello.so`文件,这就是我们要的动态库。注意`-buildmode=c-shared`这个参数,它正是生成C风格共享库的关键。
库已经造好了,怎么在别的程序里调用它呢?我们再建一个Go文件,比如`main.go`,写入以下代码来演示调用:
```go
package main
/*
#cgo LDFLAGS: -L. -lhello
#include
typedef void (*hello_func)();
int main() {
hello_func hello = (hello_func) dlsym(RTLD_DEFAULT, "Hello");
if (hello == NULL) {
return 1;
}
hello();
return 0;
}
*/
import "C"
func main() {}
```
这里用了`cgo`指令,通过`#cgo LDFLAGS: -L. -lhello`告诉链接器去当前目录找`libhello.so`库,并且链接它。代码内部用`dlsym`动态加载了`Hello`函数并调用,这是典型的C语言动态库调用方式。
最后,编译并运行这个调用程序:
```bash
go build -o main main.go
LD_LIBRARY_PATH=. ./main
```
控制台会输出:
```
Hello from Go!
```
一切正常。现在你已经掌握了在Ubuntu上用Go生成`.so`动态库,并在其他Go程序里调用它的完整方法。实际项目中,你还可以把导出的函数写得复杂些,比如返回字符串或结构体,原理都一样。
本文内容来源于网友投稿,如有侵权请联系删除。
PHP递归性能优化技巧与迭代替代方案
解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。
codex如何配置模型参数及文件设置教程
想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。
winforms教程自学入门与基础开发步骤详解
本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。
查看更多