如何在 Visual C++ 中调用 Go 编写的模块(导出为 C 兼容接口)

大明吖_3357

大明吖_3357

2026-06-30

891人浏览

原创

c++oding="utf-8" ?>

如何在 Visual C++ 中调用 Go 编写的模块(导出为 C 兼容接口)

本文详解如何将 go 编写的库通过 c abi 导出,构建为 windows 下可供 visual c++ 直接链接的静态或动态库(.lib + .dll),涵盖导出函数、跨语言编译、链接配置及实际调用全流程。

本文详解如何将 go 编写的库通过 c abi 导出,构建为 windows 下可供 visual c++ 直接链接的静态或动态库(.lib + .dll),涵盖导出函数、跨语言编译、链接配置及实际调用全流程。

Go 从 1.5 版本起原生支持通过 cgo 导出函数供 C/C++ 调用,但需严格遵循 C ABI 约定。在 Windows 平台与 Visual C++(MSVC)集成时,关键在于生成 MSVC 兼容的导入库(.lib)和动态链接库(.dll),而非 Linux 下常见的 .so 文件。以下是完整、可验证的操作流程:

✅ 1. 编写可导出的 Go 模块(C ABI 兼容)

确保 Go 代码使用 //export 注释声明导出函数,并禁用 CGO 的默认符号修饰(避免 __declspec(dllexport) 冲突):

// main.go
package main

import "C"
import "fmt"

//export Add
func Add(a, b int) int {
    return a + b
}

//export SayHello
func SayHello(name *C.char) *C.char {
    goStr := fmt.Sprintf("Hello, %s!", C.GoString(name))
    return C.CString(goStr)
}

// 必须包含此空主函数,否则 go build -buildmode=c-shared 失败
func main() {}

⚠️ 注意:

  • 所有导出函数参数和返回值必须为 C 兼容类型(如 C.int, *C.char);
  • main() 函数必须存在且为空(仅用于构建上下文);
  • 不要使用 import "unsafe" 以外的非标准包(如 net/http)——它们依赖 Go 运行时,无法在纯 C 环境中安全调用。

✅ 2. 构建 Windows 兼容的 DLL + LIB

在 Windows 上使用 MinGW-w64 或 WSL2 + GCC 作为构建工具链(⚠️ Go 官方不支持 MSVC 直接链接 c-shared 输出,故需间接生成 .lib):

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
# 方法一:生成 DLL + DEF 文件(推荐,兼容 MSVC)
go build -buildmode=c-shared -o mylib.dll main.go

# 此命令生成:
#   mylib.dll     → 动态库(含导出函数)
#   mylib.h       → 自动生成的 C 头文件(含函数声明)
#   mylib.dll.a   → MinGW 静态导入库(非 MSVC 兼容)

由于 go build -buildmode=c-shared 默认输出 MinGW 格式的 .dll.a,而 Visual C++ 需要 .lib 文件,需借助 dlltool(来自 MinGW)或 dumpbin + lib 工具转换:

# 使用 MinGW 工具链生成 MSVC 兼容 .lib(假设已安装 mingw-w64)
dlltool --dllname mylib.dll --def mylib.def --output-lib mylib.lib

其中 mylib.def 可手动编写或由 dumpbin /exports mylib.dll > exports.txt 提取后整理:

LIBRARY mylib.dll
EXPORTS
Add
SayHello

✅ 替代方案(更可靠):使用 gobind 或 TinyGo(轻量运行时)构建无 GC 依赖的纯 C 接口;或采用 CGO + C++ 封装层:用 GCC 编译 Go 为 .dll,再用 Visual Studio 创建 C++ DLL 包装器,内部 LoadLibrary + GetProcAddress 动态调用 —— 此方式完全规避 .lib 兼容性问题,且便于调试。

✅ 3. 在 Visual C++ 中调用

步骤:

  • 将 mylib.dll 放入可执行目录(如 Debug/);
  • 将 mylib.lib 添加到项目「附加依赖项」(Project Properties → Linker → Input);
  • 包含 mylib.h 并链接:
// main.cpp (Visual C++ 2022, x64)
#include <iostream>
#include "mylib.h"  // 自动生成的头文件

int main() {
    int result = Add(3, 5);
    std::cout (name));
    std::cout <blockquote>
<p>? 关键注意事项:</p>
<ul>
<li>Go 导出的字符串内存由 C.CString 分配,<strong>必须用 free() 释放</strong>(非 delete 或 LocalFree);</li>
<li>Go 运行时(如 goroutine、GC)在 c-shared 模式下仍需初始化:首次调用任意导出函数前,Go 自动触发 runtime_init,无需手动干预;</li>
<li>若使用 net, os, time 等包,需确保 Go 运行时线程模型与宿主进程兼容(建议避免复杂标准库依赖);</li>
<li>Debug 模式下建议关闭 Go 编译优化:go build -gcflags="-N -l" 便于调试符号映射。</li>
</ul>
</blockquote>
<h3>✅ 总结</h3>
<p>Go → Visual C++ 的跨语言集成可行,但本质是「Go 作为 C 共享库提供者」。核心路径为:<br>
✅ //export 声明 → ✅ go build -buildmode=c-shared → ✅ 生成 .dll + .def → ✅ dlltool 转 .lib → ✅ MSVC 链接调用。<br>
对于生产环境,推荐搭配 CMake 自动化构建流程,并将 Go 构建步骤封装为预编译任务。若对性能与部署简洁性要求极高,可考虑 TinyGo 编译无运行时 Go 代码,彻底消除 GC 和线程依赖。</p></iostream>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程