Show how to call a function in a shared library (without dynamically linking to it at compile-time). In particular, show how to call the shared library function if the library is available, otherwise use an internal equivalent function.

This is a special case of calling a foreign language function where the focus is close to the ABI level and not at the normal API level.



Related task

 OpenGL -- OpenGL is usually maintained as a shared library.


require 'fiddle/import'
 
module FakeImgLib
  extend Fiddle::Importer
  begin
    dlload './fakeimglib.so'
    extern 'int openimage(const char *)'
  rescue Fiddle::DLError
    # Either fakeimglib or openimage() is missing.
    @@handle = -1
    def openimage(path)
      $stderr.puts "internal openimage opens #{path}\n"
      @@handle += 1
    end
    module_function :openimage
  end
end
 
handle = FakeImgLib.openimage("path/to/image")
puts "opened with handle #{handle}"