0

0

如何在 Go 中正确调用 Windows 动态链接库(DLL)中的 C 函数

花韻仙語

花韻仙語

发布时间:2026-01-07 15:47:20

|

383人浏览过

|

来源于php中文网

原创

如何在 Go 中正确调用 Windows 动态链接库(DLL)中的 C 函数

本文详解 go 程序通过 cgo 调用 msvc 编译的 windows dll 的标准方法,重点解决符号未定义(undefined reference)链接错误,涵盖 cflags/ldflags 配置、导入库(.lib)必要性及常见误区。

在 Windows 平台上使用 Go 调用自定义 DLL 函数时,不能直接将 .dll 文件路径传给链接器(如 -LC:/.../bin MyModule.dll),这是导致 undefined reference to 'moduleImpl_len' 错误的根本原因。GCC/MinGW(cgo 默认使用的工具链)在链接阶段需要的是 导入库(Import Library,即 .lib 文件),而非 .dll 本身——.dll 仅在运行时动态加载,链接期必须通过 .lib 提供符号定义和跳转桩(thunk)。

✅ 正确做法是:

  1. 确保你拥有与 DLL 对应的 .lib 文件(MSVC 编译 DLL 时默认生成,例如 MyModule.lib);
  2. 将 .lib 放置于 #cgo LDFLAGS 可访问路径,并使用 -l 标志链接(不带 .lib 后缀);
  3. 正确设置头文件路径与链接库路径。

修改你的 cgo 指令如下:

//#cgo CFLAGS: -IC:/Repos/Module/include
//#cgo LDFLAGS: -LC:/Repos/Module/go/bin -lMyModule
//#include 
import "C"

⚠️ 注意事项:

陌言AI
陌言AI

陌言AI是一个一站式AI创作平台,支持在线AI写作,AI对话,AI绘画等功能

下载
  • -L 指定的是 目录路径(如 -LC:/Repos/Module/go/bin),不是文件路径;
  • -lMyModule 会令链接器查找 libMyModule.a(MinGW)或 MyModule.lib(MSVC 兼容模式下,需确保 CGO_ENABLED=1 且使用 gcc-based 工具链,如 TDM-GCC 或 MinGW-w64);
  • 若你只有 .dll 没有 .lib,可使用 dlltool(MinGW)从 DLL 生成导入库:
    dlltool -d MyModule.def -l libMyModule.a --dllname MyModule.dll

    (其中 .def 文件可通过 dumpbin /exports MyModule.dll > exports.txt 手动整理生成)

  • 不要依赖 syscall.LoadDLL + FindProc(即纯反射调用)来绕过链接问题——这虽可行,但丧失了类型安全、编译期检查和 cgo 的自动内存管理优势。

? 补充建议:

  • 在 MyModule.h 中确保函数声明为 extern "C"(已满足),避免 C++ 名字修饰(name mangling);
  • 使用 go build -x 查看实际调用的 gcc 命令,确认 -lMyModule 和 -L... 是否出现在链接参数中;
  • 若仍报错,请运行 nm -C libMyModule.a | grep moduleImpl_len(MinGW)或 dumpbin /symbols MyModule.lib | findstr moduleImpl_len(MSVC)验证符号是否真实存在且未被修饰。

遵循上述配置后,C.moduleImpl_len() 即可成功链接并调用,无需退化至底层 syscall 方案。

相关专题

更多
undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

4314

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2917

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

183

2025.12.25

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

565

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1084

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

775

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2345

2023.08.08

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

2

2026.01.09

热门下载

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

精品课程

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

共32课时 | 3.5万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号