0
0

More than 3 years have passed since last update.

FiddleでRubyのCバインディングを作るときは RbConfig::CONFIG['SOEXT'] で共有ライブラリの拡張子を取得できる

Last updated at Posted at 2021-07-14

タイトルの通りです。

RubyでFFIを利用してC言語のライブラリなどのバインディングを作成するときは、

  • Rubyの標準ライブラリのFiddleを利用する方法
  • Ruby-FFIを利用する方法

があります。その際に、プラットフォームごとに、共有ライブラリのファイルの拡張子が異なるため、case 文で分岐を作成する必要がありました。例えばこんな感じです。

case文による分岐

lib_name = case RbConfig::CONFIG['host_os']
           when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
             'libssw.dll'   # unconfirmed
           when /darwin|mac os/
             'libssw.dylib' # unconfirmed
           else
             'libssw.so'
           end

RbConfig::CONFIG['host_os'] の代わりに RUBY_PLATFORM を使ってもよいかもしれません。

FFI::Platform::LIBSUFFIX

Ruby-FFIを利用している場合は、FFI::Platform::LIBSUFFIX で共有ライブラリの拡張子を取得できます。

require 'ffi'
p FFI::Platform::LIBSUFFIX
# dll   : Windows
# dylib : macOS
# so    : Ubuntu

RbConfig::CONFIG['SOEXT']

Fiddleを利用する場合は、RbConfig::CONFIG['SOEXT'] で共有ライブラリの拡張子を取得できます。これは Ruby 2.5以上が必要です。しかし、すでにRuby2.4はRubyの公式サポートから外れていますので、これから新規作成するライブラリでは気にせずに使ってよいと思います。

p RbConfig::CONFIG['SOEXT']
# dll   : windows
# dylib : macOS
# so    : Ubuntu

便利ですね。これを使えば、下記のようにすることで、不要なcase分岐を回避できます。

lib_name = "libssw.#{RbConfig::CONFIG["SOEXT"]}"

この記事は以上です。

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