如何使用 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 中使用 g++ 编译器

如何配置 Visual Studio Code 以使用 IAR 编译器构建项目?

如何使用 Mono 编译 Visual Studio C# 项目

如何使用Mono编译Visual Studio C#项目