0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

devboxのGoで「Undefined symbols for architecture arm64」エラーが出たときはCGO_ENABLED=0すると解決する

Posted at

devbox(Nix)環境でgo installすると発生する「Undefined symbols for architecture arm64」というmacOS特有のエラーはCGO_ENABLED=0を付けると解決するという話をします。

この投稿で学べること

  • devbox環境でのGoリンクエラーの原因
  • CGO_ENABLEDを使った手っ取り早い解決策

問題: リンクエラーが発生する

devbox(Nix)環境のGoでgo installを実行すると、macOS/arm64で次のようなエラーに遭遇することがあります。

Undefined symbols for architecture arm64:
  _SecTrustCopyCertificateChain

このエラーは、cgoがAppleのSecurity.frameworkをリンクしようとする際、Nixのclang-wrapperやSDKとの相性問題で解決できずに発生します。

解決策: CGO_ENABLEDを無効化する

cgoを無効化すると、この問題は解決します。

基本的な使い方

コマンドラインでインストールする場合、次のようにCGO_ENABLED=0を付けて実行します。

CGO_ENABLED=0 go install <package>@<version>

例えば、kustomizeをインストールする場合は次のようになります。

CGO_ENABLED=0 GOBIN=./bin go install sigs.k8s.io/kustomize/kustomize/v5@v5.7.1

Makefileでの対処

Makefile経由でインストールする場合も同様です。

CGO_ENABLED=0 make install

あるいは、ツール取得ターゲットだけcgoを切る方法もあります。

CGO_ENABLED=0 go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION)

代替案: devboxのパッケージを直接使う

ビルド自体を避ける方法として、devboxに直接パッケージを追加する選択肢もあります。

例えば、devbox add kustomizeを追加し、bin/kustomizeをPATH上の実体へシンボリックリンクすることで、ビルドプロセスそのものを回避できます。

注意点: アプリ本体でcgoが必要な場合

アプリケーション本体でcgoが必要な場合は、そのビルド時にはCGO_ENABLED=1に戻す必要があります。

ポイントは、「ツールのgo installだけcgoを切る」という点です。これだけで、大抵の場合はすんなり通ります。

まとめ

devbox環境でGoツールのインストール時にリンクエラーが出た場合、CGO_ENABLED=0を付けるだけで解決できます。この方法は、Nix特有のSDKやclang-wrapperとの相性問題を回避する、最も手軽な対処法になります。

最後までお読みくださりありがとうございました。Twitter では、Qiita に書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいです:relieved:Twitter@suin

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?