H

Goのコンパイルに失敗してrunning gcc failed: exit status 1と出た時の解決法

GoでPythonのモジュールを作成しようと、コードを作りコンパイルをしたとき、それが起こった。

PythonからGo、GoからPythonを呼び出し合う - Qiita
こちらの記事を参考に、以下のコマンドを走らせた。

go build -buildmode=c-shared -o python/convArr.so python/chobit.go

ここで次のようなエラーが出た。

D:\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1
d:/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: unrecognized option '--high-entropy-va'
d:/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: use the --help option for usage information
collect2.exe: error: ld returned 1 exit status

(余談だが、私はCドライブの容量をケチるため、GoとMinGWをDドライブに入れている。)
情報

  1. OS: Windows 10
  2. GO Version: 1.17.4
  3. GCC Version:9.2.0

最初、慣れないオプション

-buildmode=c-shared

を使ったため、これが原因だと推定した。そこで、このオプションを消してみると、なんとコンパイルに成功した。
(成功したコマンド)

go build -o python/convArr.so python/chobit.go

成功したものの、Pythonからの呼び出しには失敗する。そこでGoのPythonからの呼び出しについて解説している多くの記事を見たところ、共通してこの慣れないオプションを使っていた。そのためこのオプションは必要なものと考え、なんとかこのオプションを使う道を探った。

まずMinGWのアップデートをサボっていたので、MinGW Installation Managrを起動しアップデートを実行した。しかし同じエラーが出た。

次にMinGW自体の問題と考え、こちらの記事
github.com
を参考に、別のMinGW(この書き方であっているかわかんない)を入れてみることにした。
記事内にあったリンクを踏んで入れてみたが、いまいち治らない。

そこで、MinGWの代わりにtdm-gccを入れてみた。(もしかしたら共存できるのかもしれないけど、まあMinGW自体の問題だと思うしそんなにパッケージに詳しくないし……教えて詳しい人!!!)
適当に環境変数通したら、なんと成功しましたとさ。
この問題の考察は詳しい人がきっとどこかでやってくれているでしょう。

p.s.
GCCのバージョンは10.3.0になりました。