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”。

谷歌搜索结果显示,此类错误通常有两种情况:

  1. Go1.5 和 Go1.4.2 安装到了同一位置。
  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

3 回复

我是Go语言世界的新手,这是我在此论坛的第一篇帖子(不知道如何将主题标记为已解决)。 我使用“go get”来下载和安装包及其依赖项。

更多关于Golang中未使用CGO或SWIG时不允许使用C源文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


rot13:

来自仓库 README.md 文件中的构建部分。

Eric,非常感谢你指出这一点。我今天在 Linux 上尝试构建它,并且构建成功了。

这个问题通常是由于Go编译器在非cgo模式下尝试编译C源文件导致的。从你的构建命令来看,CGO_ENABLED=1已经设置,但问题可能在于构建标签或文件命名。

检查你的项目结构,确保C文件被正确放置在_cgo前缀的目录中,或者使用正确的构建标签。以下是解决方案:

  1. 检查构建标签:确保在包含C文件的目录中,Go文件使用了正确的构建标签。例如:
// +build cgo

package main
  1. 检查文件命名:C源文件应该与对应的Go文件在同一目录,并且Go文件需要导入"C"伪包:
// cloned_binary.go
package main

/*
#include "cloned_binary.c"
*/
import "C"
  1. 如果问题仍然存在,可以尝试强制启用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 .
  1. 检查init.go文件:错误指向init.go:10:2,查看该文件的第10行,确保导入语句正确:
// init.go
package main

import (
    _ "github.com/opencontainers/runc/libcontainer/nsenter"
    // 确保这行没有导入问题
)
  1. 清理并重新构建
make clean
CGO_ENABLED=1 make

如果以上方法都不行,可能是项目本身的构建配置问题。可以检查runc项目的Makefile,看是否有特殊的构建条件或环境变量需要设置。

回到顶部