`-no_pie is deprecated when targeting new OS versions`エラーに遭遇して解決した話
結論
Go言語のバージョンを1.17
から1.20
に上げると解決しました。(1.18
や1.19
でも良さそう)
はじめに
私が携わっているプロジェクトでは、oapi-codegenを使ってOpenAPIクライアントとコードの自動生成を行っているのですが、ある日突然エラーが出て失敗するようになってしまいました。
ld: warning: -no_pie is deprecated when targeting new OS versions
エラーメッセージにはtargeting new OS versions
と書いてあるものの、OSやその他のバージョンを変更した覚えはありません。
当時の環境はこんな感じです。
- macOS:Monterey
- プロセッサ:Intel
- Go言語のバージョン:1.17.0 darwin/amd64
- XCodeのバージョン:覚えていないけど、最新じゃなかった
試したこと
Xcodeをアップデート:関係なし
インストールに時間がかかるXcodeのアップデートはついサボってしまいがちだったので、コイツが原因かと思い最新版(14.2
)にアップデートしてみましたが、エラーは解決しませんでした。
macOSのアップデート:関係なし
ついでにmacOSをVenturaにアップデートしてみましたが、これも関係なし。関係ないだろうとは思っていたので予想通りです。
Go言語のアップデート:解決!
エラーメッセージでググっていたところ、Go言語を1.18
or 1.19
に上げると解決したとの情報を見つけました。プロジェクトのGo言語は1.17
だったのですが、プログラムに影響がないことを確認した上で1.20
にあげてみたところ、例のエラーがでなくなり無事解決しました。
Go言語のバージョンを上げる以外に、ビルド時に-buildmode=pie
フラグをつけることが解決法として挙げられていましたが、oapi-codegenのコマンドに-buildmode=pie
は使用できなさそうでした。その他にも古いバージョンのリンカーを使用するなども挙げられていましたが、プロジェクトに影響がないのであればGo言語のバージョンを上げてしまうのが一番手っ取り早そうです。
おまけ:Go言語のバージョンの上げ方
備忘録としてGo言語のバージョンの上げ方を書き残します。
goenv install -l
で最新版を確認
1. goenv install -l
して出てきたものがこちら
$ goenv install -l
Available versions:
1.2.2
.
.
.
1.17rc2
1.17
で止まってました。Go言語のバージョンを上げる前にgoenvのバージョンをあげないといけないようです。
anyenv-update
でgoenvをアップデート
2. 私はanyenvを使用しているのでgoenvをアップデートするには anyenv update
すれば良いようです。
$ anyenv update
anyenv: no such command `update'
どうやらanyenv-updateというプラグインが必要だったようなので導入します。
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
再度 anyenv update
してからgoenv install -l
してみます。
$ goenv install -l
Available versions:
1.2.2
.
.
.
1.20.1
goenvがアップデートされて1.20
が選べるようになりました。
3. Go言語の最新版をインストール
ようやくGo言語の最新版をインストールできます。
$ goenv install 1.20.0
$ goenv global 1.20.0
$ goenv versions
1.17.0
* 1.20.0 (set by /Users/***/.anyenv/envs/goenv/version)
あとはGOROOTまたはGOPATH、go modなどを最新のGo言語バージョンに合わせたら無事完了です!
Discussion