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.


DLD addLibrary: 'fakeimglib'.
 
Object subclass: ExtLib [
  ExtLib class >> openimage: aString [
    (CFunctionDescriptor isFunction: 'openimage')
    ifTrue: [
       (CFunctionDescriptor for: 'openimage'
                            returning: #int
                            withArgs: #( #string ) ) callInto: (ValueHolder null).
    ] ifFalse: [ ('internal open image %1' % { aString }) displayNl ]
  ]
].
 
ExtLib openimage: 'test.png'.