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环境,包括正确的编译器标志和链接库。

