4

我正在尝试构建一个使用 C 和 C++ 编写的第三方库 (GDAL) 的 go 项目。我遇到了这个错误:

In file included from contour.cpp:31:0:
cpl_port.h:187:6: error: #error Must have C++11 or newer.
 #    error Must have C++11 or newer.
      ^
In file included from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/type_traits:35:0,
                 from cpl_conv.h:372,
                 from contour.cpp:39:
C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^

一些搜索告诉我这是预期的,解决方法是简单地在编译器上设置一个标志(不相关,但仍然相关)。

我已经阅读了go 的构建文档,虽然它表明可以为单个编译器指定选项,但它没有明确说明如何,也没有提供任何示例。

我已经尝试了以下只是猜测,当 go build 命令接受它们时,它们会产生相同的错误,因此它们不起作用。

go build -gcflags -std=gnu++11 -ldflags -std=gnu++11
go build -gcflags -std=c++11 -ldflags -std=c++11
go build -gcflags -std=c++11
go build -gcflags -std=all=gnu++11 -ldflags -std=all=gnu++11

如何告诉 go 告诉 gcc 使用 C++11 或更高版本进行编译?

编辑:根据 PeterSO 的要求:

H:\>go version
go version go1.10.2 windows/amd64

H:\>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\ksexton\AppData\Local\go-build
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=H:\ksexton\Go;
set GORACE=
set GOROOT=C:\Go
set GOTMPDIR=
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\ksexton\AppData\Local\Temp\go-build937852322=/tmp/go-build -gno-record-gcc-switches

H:\>gcc --version
gcc (tdm64-1) 5.1.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

H:\>g++ --version
g++ (tdm64-1) 5.1.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4

1 回答 1

3

命令 cgo

通过 go 命令使用 cgo

包中的所有 cgo CPPFLAGS 和 CFLAGS 指令都被连接起来,用于编译该包中的 C 文件。包中的所有 CPPFLAGS 和 CXXFLAGS 指令都被连接起来并用于编译该包中的 C++ 文件。包中的所有 CPPFLAGS 和 FFLAGS 指令都被连接起来并用于编译该包中的 Fortran 文件。程序中任何包中的所有 LDFLAGS 指令都被连接起来并在链接时使用。所有 pkg​​-config 指令都被连接起来并同时发送到 pkg-config 以添加到每个适当的命令行标志集。


在 Windows 上:

set CGO_CXXFLAGS=-std=c++11
于 2018-06-25T15:19:40.643 回答