⚙️

Xcode 14な環境でnumo-linalgのインストールにundefined symbolsで失敗したらldflagsを指定する

2022/11/25に公開

概要

Xcode 14な環境でRuby 3.1がビルドできなかったのが、Ruby 3.1.3で修正されました。が、Ruby 3.1.3でgem install numo-linalgしたら、native extensionsのビルドでこけました。ldflagsをいい感じに与えて、これを解決します。

エラーと解決方法

Xcode14なRuby 3.1.3で、numo-linalgをgem installすると、エラーになりました。

$ ruby -v
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [arm64-darwin21]
$ gem install numo-linalg

# ... いろいろwarningがでるが以下が問題

linking shared-object numo/linalg/blas.bundle
Undefined symbols for architecture arm64:

# ...

ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [blas.bundle] Error 1

未定義シンボル(undefined symbols)を実行時に検索するようにするオプションをつければイケます。

$ gem install numo-linalg -- --with-ldflags="-undefined dynamic_lookup"
Building native extensions with: '--with-ldflags=-undefined dynamic_lookup'
This could take a while...
Successfully installed numo-linalg-0.1.7
Parsing documentation for numo-linalg-0.1.7
Installing ri documentation for numo-linalg-0.1.7
Done installing documentation for numo-linalg after 5 seconds

動作もバッチリ。

$ irb
irb(main):001:0> require 'numo/linalg/autoloader'
=> true
irb(main):002:0> x = Numo::DFloat.new(5,4).rand
=>
Numo::DFloat#shape=[5,4]
...
irb(main):003:0> x.dot(x.transpose)
=>
Numo::DFloat#shape=[5,5]
[[0.815142, 0.713004, 0.128882, 0.540077, 0.483863],
 [0.713004, 0.967739, 0.145705, 0.57617, 0.572453],
 [0.128882, 0.145705, 0.046242, 0.221983, 0.19481],
 [0.540077, 0.57617, 0.221983, 1.19124, 0.930322],
 [0.483863, 0.572453, 0.19481, 0.930322, 0.830851]]
irb(main):004:0> Numo::Linalg.eigh(x.dot(x.transpose))
=>
[Numo::DFloat#shape=[5]
[-7.66594e-18, 0.0517181, 0.180783, 0.691671, 2.92704],
 Numo::DFloat#shape=[5,5]
[[-0.023065, 0.1113, -0.738971, 0.507199, 0.428662],
 [-0.00768393, -0.209208, 0.636115, 0.568333, 0.478047],
 [0.983051, 0.122389, 0.0159079, -0.06121, 0.120965],
 [-0.0289072, -0.591828, -0.133724, -0.550381, 0.572802],
 [-0.179401, 0.760661, 0.176478, -0.336275, 0.49496]]]
irb(main):005:0>

Bundlerだとこうかな、おそらく。

$ bundle config build.numo-linalg --with-ldflags="-undefined dynamic_lookup"

こちらからは以上です。

Discussion