想在 CentOS 里把 Go 代码封装成静态库,给现有的 C 或 C++ 项目直接调用,关键并不在步骤多,而在几个容易写错的细节:导出函数声明、构建模式和链接参数。下面按一个最小示例拆开说明,从安装 Go、编写导出函数,到生成 .a 和头文件,再到用 gcc 完成链接,照着执行就能快速验证整套流程。
先准备 Go 环境
开始之前,先确认 CentOS 已安装 Go。文中的做法是直接使用 yum:
sudo yum install golang
安装完成后,可以执行下面的命令检查是否可用:
go version
只要能正常输出版本号,就可以继续后面的静态库打包流程。
创建项目并初始化模块
接下来创建一个独立目录,这里以 mylib 为例:
mkdir mylib
cd mylib
go mod init mylib
go mod init mylib 会初始化一个 Go 模块。这个名字可以改,但项目目录、包名和后续产物命名最好保持一致,排查问题时会更直接。
编写可导出的 Go 代码
真正决定静态库能否被 C 调用的,是代码里的导出方式。创建一个 lib.go 文件,保留文中这个最小示例:

// lib.go
package mylib
import "C"
//export Add
func Add(a, b int) int {
return a + b
}
func main() {}
这里有三个关键点需要注意:
1. 必须包含 import "C"
这是启用 cgo 导出能力的前提,没有这一行,Go 不会按 C 可调用接口来处理相关函数。
2. 要用 //export 标注导出函数
例如示例中的 //export Add,表示把下面的 Add 函数导出给 C 使用。这个注释要紧贴函数声明,名称也要保持一致。

3. 保留空的 main() 函数
原文中的做法保留了一个空的 main()。按这个示例执行时,这一行不要省略,因为这里是按生成可供外部链接的归档产物来组织代码的。
用 c-archive 生成静态库
核心构建命令如下:
go build -o libmylib.a -buildmode=c-archive lib.go
这一步最关键的参数是 -buildmode=c-archive。它会让 Go 在构建完成后输出适合 C/C++ 链接的静态归档文件,而不是普通的可执行文件。
执行后会得到两个结果文件:
libmylib.a:静态库文件libmylib.h:自动生成的 C 头文件,包含导出函数声明
其中头文件不需要手写,Go 会根据导出的函数自动生成,这也是这种方式最省事的地方。
在 C 项目中调用生成的静态库
把 libmylib.a 和 libmylib.h 放到你的 C 项目目录后,可以写一个最简单的调用示例 main.c:
#include <stdio.h>
#include "libmylib.h"
int main() {
int result = Add(3, 4);
printf("Result: %d\n", result);
return 0;
}
接着用 gcc 进行编译和链接:
gcc -o main main.c -L. -lmylib
这里两个参数最值得看清:
-L. 表示库搜索目录
也就是让编译器到当前目录中查找要链接的静态库文件。
-lmylib 对应的是 libmylib.a
链接时写的是库名,而不是完整文件名。也就是说,libmylib.a 会被写成 -lmylib,去掉前缀 lib 和后缀 .a。
运行结果与排查重点
编译完成后,直接运行生成的程序:
./main
按照示例代码,输出结果应当是:
Result: 7
如果你是第一次做这类集成,通常优先检查下面两个位置:
//export注释是否和函数名完全对应go build是否确实使用了-buildmode=c-archive
把这两个点写对后,剩下的流程基本就是标准的“生成 .a + 头文件,再交给 C 编译器链接”。对于需要把 Go 能力嵌入老项目、工具链或 C/C++ 服务里的场景,这是一条相对直接且实用的集成方式。









