如何使用 Visual Studio 编译器使用 cgo 构建库?
Posted
技术标签:
【中文标题】如何使用 Visual Studio 编译器使用 cgo 构建库?【英文标题】:How to build a library with cgo using visual studio compiler? 【发布时间】:2018-05-13 09:30:08 【问题描述】:这是一个新手问题,但我似乎无法解决问题。
我知道我应该使用 CC=、CXX= 并且我知道 vs 编译器名称是 cl,但我不确定 c++ 编译器是否也是如此。
现在假设编译器名称都是 cl ,我得到错误: go build CC=cl cxx=cl --buildmode=c-shared -o ../lib/core.dll
我得到:无法加载包:包 CC=cl:在以下任何一个中都找不到包“CC=cl”:...
另一方面,如果我尝试在没有 CC / CXX 选项的情况下进行编译,那么一切正常。
总结一下: 1. vs的c和c++编译器名称是什么? 2. 为什么在选择要使用的编译器时出现错误?
【问题讨论】:
MSVC 通常不使用 CC 和 CXX 变量。相反,您从已从适当的 VisualStudio 安装执行 vcvarsall.bat 的 CMD shell 运行构建工具。通常的方法是使用 VS 安装程序在开始菜单中放置的“Visual Studio 命令提示符”快捷方式,但您也可以从任何 CMD shell 运行 vcvarsall.bat。不过,我从未使用过 cgo,所以我不确定这是使用该工具链做事的适当方式。 【参考方案1】:我尝试在 Visual Studio 中使用最新的 go 1.13 和 Liron 的方法使用 cgo。它的工作方式有点不同。我无法使用提取的存根库将 dll 连接到 Visual Studio。相反,我做了一些我不太了解的事情来让它发挥作用:
-
使用 c 共享构建模式创建 .dll(使用 go 1.13 和 gcc 编译器)。
使用 c-archive 构建模式创建 .lib。
使用 .lib 编译,使用 .dll 访问所有函数。如果我直接使用.lib,访问时所有功能都会停止。如果我使用从 dll 中提取的存根库,程序甚至无法成功加载。
【讨论】:
你的回答真的很有帮助,否则我什至不知道如何在visual studio中运行它。【参考方案2】:在玩了几天之后,似乎创建一个可以与 Visual Studio 一起使用的库的唯一可行方法是:
-
创建一个 .dll(使用 cgo 和 go 1.10+)
使用 bat 文件或HERE 中提到的方法创建一个存根库,将 dll 连接到 Visual Studio。
附带说明,也可以使用 loadlibrary func(我没有尝试过,因为我试图避免这种方法,因为它似乎不是推荐的方法)。【讨论】:
以上是关于如何使用 Visual Studio 编译器使用 cgo 构建库?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio 编译器使用 cgo 构建库?
如何使用 makefile 使用 Visual Studio 编译代码
如何配置 Visual Studio Code 以使用 IAR 编译器构建项目?