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程序里调用它的完整方法。实际项目中,你还可以把导出的函数写得复杂些,比如返回字符串或结构体,原理都一样。
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
漫蛙下载最新版本
2026-10-13 13:42
漫蛙app下载安装最新版
2026-10-13 13:42
漫蛙2漫画APP免费下载安装最新版本
2026-10-13 13:20
漫蛙漫画网页下载安装最新版本
2026-10-13 13:17
keyshot快捷键命令大全表格整理与使用教程
2026-10-12 14:13
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多










































