Golang中未使用CGO或SWIG时不允许使用C源文件
Golang中未使用CGO或SWIG时不允许使用C源文件 你好,
我正在按照 runc 的说明在 Mac 上编译 “runc”。每次尝试时,都会遇到错误:“C source files not allowed when not using cgo or SWIG: cloned_binary.c nsexec.c”。
谷歌搜索结果显示,此类错误通常有两种情况:
- Go1.5 和 Go1.4.2 安装到了同一位置。
- 交叉编译。
这两种情况都与我的情况不符。如果有人能提供任何建议,我将不胜感激。这个问题困扰我很久了。以下是 Go 版本、环境信息和错误详情。
lexli-mbp$ go version
go version go1.13.3 darwin/amd64
lexli-mbp$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/lexli/Library/Caches/go-build"
GOENV="/Users/lexli/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/lexli/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/v7/5f5dfb8173z185b2jdbkwh080000gn/T/go-build755493385=/tmp/go-build -gno-record-gcc-switches -fno-common"
lexli-mbp$ pwd
/Users/lexli/go/src/github.com/opencontainers/runc
lexli-mbp$ make
go build -buildmode=pie -ldflags "-X main.gitCommit="c4d8e1688c816a8cef632a3b44a38611511b7140" -X main.version=1.0.0-rc9+dev " -tags "seccomp" -o runc .
init.go:10:2: C source files not allowed when not using cgo or SWIG: cloned_binary.c nsexec.c
make: *** [runc] Error 1
更多关于Golang中未使用CGO或SWIG时不允许使用C源文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我是Go语言世界的新手,这是我在此论坛的第一篇帖子(不知道如何将主题标记为已解决)。 我使用“go get”来下载和安装包及其依赖项。
更多关于Golang中未使用CGO或SWIG时不允许使用C源文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个问题通常是由于Go编译器在非cgo模式下尝试编译C源文件导致的。从你的构建命令来看,CGO_ENABLED=1已经设置,但问题可能在于构建标签或文件命名。
检查你的项目结构,确保C文件被正确放置在_cgo前缀的目录中,或者使用正确的构建标签。以下是解决方案:
- 检查构建标签:确保在包含C文件的目录中,Go文件使用了正确的构建标签。例如:
// +build cgo
package main
- 检查文件命名:C源文件应该与对应的Go文件在同一目录,并且Go文件需要导入"C"伪包:
// cloned_binary.go
package main
/*
#include "cloned_binary.c"
*/
import "C"
- 如果问题仍然存在,可以尝试强制启用cgo进行构建:
CGO_ENABLED=1 go build -buildmode=pie -ldflags "-X main.gitCommit=\"c4d8e1688c816a8cef632a3b44a38611511b7140\" -X main.version=1.0.0-rc9+dev" -tags "seccomp cgo" -o runc .
- 检查init.go文件:错误指向
init.go:10:2,查看该文件的第10行,确保导入语句正确:
// init.go
package main
import (
_ "github.com/opencontainers/runc/libcontainer/nsenter"
// 确保这行没有导入问题
)
- 清理并重新构建:
make clean
CGO_ENABLED=1 make
如果以上方法都不行,可能是项目本身的构建配置问题。可以检查runc项目的Makefile,看是否有特殊的构建条件或环境变量需要设置。

