You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库,步骤如下:

  1. 打开对应版本的Visual Studio开发者命令提示符(如x64 Native Tools Command Prompt for VS 2022,根据目标架构选择),执行cl命令验证编译器是否可用。
  2. 切换到print.go所在的E:\Test目录。
  3. 执行编译命令:
    go build -buildmode=c-shared -o libprinter.dll print.go
    
    此时Go会调用MSVC的cl编译器生成符合MSVC ABI的libprinter.dll及配套头文件libprinter.h、导入库libprinter.lib。
  4. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:05:13