`-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言語のバージョンの上げ方を書き残します。
1. goenv install -lで最新版を確認
goenv install -lして出てきたものがこちら
$ goenv install -l
Available versions:
1.2.2
.
.
.
1.17rc2
1.17で止まってました。Go言語のバージョンを上げる前にgoenvのバージョンをあげないといけないようです。
2. anyenv-updateでgoenvをアップデート
私は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