Windows下含import "C"的Go代码生成共享库及VS兼容问题
解决Go生成C共享库的报错及VS cl编译器兼容问题
一、解决编译报错:go: no Go source files
执行go build -buildmode=c-shared -o libprinter.dll print.go时出现该错误,核心原因及解决方式:
- 确保当前命令执行路径是
print.go所在的E:\Test目录,检查文件名是否拼写正确(Windows下大小写不敏感,但尽量保持命令与文件名一致)。 - 关键问题:Go编译
c-shared模式必须依赖C编译器,之前环境未配置可用的C编译器,导致编译流程中断,错误提示存在误导。安装MinGW GCC并配置到系统环境变量后,C编译器可用,因此能正常生成dll文件。
二、生成兼容VS cl编译器的Go共享库
MinGW GCC生成的dll采用GCC ABI,与MSVC(cl编译器)的ABI不兼容,需使用VS自带的MSVC工具链编译Go库,步骤如下:
- 打开对应版本的Visual Studio开发者命令提示符(如
x64 Native Tools Command Prompt for VS 2022,根据目标架构选择),执行cl命令验证编译器是否可用。 - 切换到
print.go所在的E:\Test目录。 - 执行编译命令:
此时Go会调用MSVC的cl编译器生成符合MSVC ABI的go build -buildmode=c-shared -o libprinter.dll print.golibprinter.dll及配套头文件libprinter.h、导入库libprinter.lib。 - 在Visual Studio中编译
main.cpp:- 将
libprinter.h、libprinter.dll、libprinter.lib放入项目目录。 - 在项目属性中,将头文件所在目录添加到附加包含目录。
- 将
libprinter.lib添加到附加依赖项。 - 编译运行即可正常调用Go导出的
SumPrint函数。
- 将
附相关代码
print.go
import ( "C" "fmt" ) //export SumPrint func SumPrint(a, b int) C.int { fmt.Println("Sum printed form GO code = ", a+b) return C.int(a + b) } func main() {}
main.cpp
#include <iostream> #include "libprinter.h" int main() { int a, b; std::cin >> a >> b; std::cout << "Sum of " << a << " and " << b << " is : " << SumPrint(a, b) << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Vibhanshu Rai
相关产品推荐
相关产品推荐

