Golang中如何解决未使用cgo或SWIG时C++源文件bind.cc不被允许的问题

Golang中如何解决未使用cgo或SWIG时C++源文件bind.cc不被允许的问题 在尝试用 Go 编译 BigQuery 模拟器时,我们遇到了这个错误:

当未使用 cgo 或 SWIG 时,不允许使用 C++ 源文件:bind.cc

1 回复

更多关于Golang中如何解决未使用cgo或SWIG时C++源文件bind.cc不被允许的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go编译过程中遇到"C++源文件不被允许"的错误,通常是因为项目中包含了C++文件但未正确配置cgo。以下是解决方案:

1. 确保正确启用cgo

在包含C++文件的目录中,需要设置CGO_ENABLED环境变量:

# 启用cgo
export CGO_ENABLED=1

# 或者在编译时指定
CGO_ENABLED=1 go build

2. 创建正确的cgo绑定文件

如果bind.cc是C++文件,需要创建对应的Go文件来声明cgo绑定:

// bind.go
package main

/*
#cgo CXXFLAGS: -std=c++11
#include "bind.cc"
*/
import "C"

// Go包装函数
func CallBindFunction() {
    C.bind_function()
}

3. 处理C++与C的兼容性

如果bind.cc是纯C++代码,可能需要创建C接口包装:

// bind_wrapper.h
#ifdef __cplusplus
extern "C" {
#endif

void bind_function_wrapper();

#ifdef __cplusplus
}
#endif

// bind_wrapper.cc
#include "bind_wrapper.h"
#include "bind.cc"

extern "C" void bind_function_wrapper() {
    // 调用原始的C++函数
    bind_function();
}

然后在Go中:

// wrapper.go
package main

/*
#cgo CXXFLAGS: -std=c++11
#include "bind_wrapper.h"
*/
import "C"

func CallBind() {
    C.bind_function_wrapper()
}

4. 检查构建标签

确保文件没有错误的构建标签限制:

// +build cgo
// 文件顶部添加这个构建标签

5. 完整示例结构

project/
├── main.go
├── bind.go          # cgo声明文件
├── bind.cc          # C++源文件
├── bind.h           # C++头文件
└── go.mod

bind.go内容:

package main

/*
#cgo CXXFLAGS: -std=c++11
#include "bind.h"
*/
import "C"

func main() {
    C.initialize()
    // 使用C++功能
}

6. 编译命令

# 确保使用正确的编译器
export CC=gcc
export CXX=g++

# 编译
CGO_ENABLED=1 go build -o output

对于BigQuery模拟器这类项目,通常需要完整配置cgo环境,包括正确的编译器标志和链接库。

回到顶部