Subject:
Re: [ruby-ffi] need help loading a library
From:
Luis Lavena
Date:
4/30/11 4:36 PM
To:
ruby-ffi@googlegroups.com

On Mon, Apr 25, 2011 at 4:59 PM, Chuck Remes <cremes.devlist@mac.com> wrote:
>
> Fantastic.
>
> In the meantime I will continue working on figuring this out.
>

Hello Chuck, sorry took me some time to get back to you on this.

I believe I found the root on why ffi is not able to load libzmq.dll,
where you place libzmq.dll or your wrapper, the issue is associated
with G++ and std C++ library dependency.

zeromq uses C++ and libstdc++, which automatically triggers the
dependency on libstdc++-6.dll and that dll depends on
libgcc_s_sjlj-1.dll.

Not having these DLLs in the PATH will trigger the module not being found:

irb(main):004:0> module ZeroZMQ
irb(main):005:1> extend FFI::Library
irb(main):006:1> ffi_lib "libzmq.dll"
irb(main):007:1> end
LoadError: Could not open library 'libzmq.dll': The specified module
could not be found.

        from C:/Users/Luis/.gem/ruby/x86-mingw32/1.9.1/gems/ffi-1.0.7-x86-mingw32/lib/ffi/library.rb:75:in
`block in ffi_lib'
        from C:/Users/Luis/.gem/ruby/x86-mingw32/1.9.1/gems/ffi-1.0.7-x86-mingw32/lib/ffi/library.rb:54:in
`map'
        from C:/Users/Luis/.gem/ruby/x86-mingw32/1.9.1/gems/ffi-1.0.7-x86-mingw32/lib/ffi/library.rb:54:in
`ffi_lib'
        from (irb):6:in `<module:ZeroZMQ>'
        from (irb):4
        from C:/Users/Luis/Tools/Ruby/ruby-1.9.2-p180-i386-mingw32/bin/irb:12:in
`<main>'
irb(main):008:0> exit

Once I've added these libraries to the path (using devkitvars.bat) the
module start to work.

Now, use stdc++ as shared object is the default behavior of MinGW, and
I believe other versions of GCC too.

We found something similar with Gordon Thiesfeld when he was updating
exerb-mingw for a newer version of Pik.

He worked out adding -static-libgcc to g++ during compilation, but I'm
not sure if you can add that to the configure process as CPPFLAGS:

sh configure --prefix=C:/installed/zeromq CPPFLAGS=-static-libgcc

I've just tested this and inspecting with Dependency Walker still
makes the dependency on libstdc++-6.dll

In the meantime, you can copy these dlls from DevKit's mingw/bin
directory and place in zeromq bin one.

Regards,
-- Luis Lavena AREA 17 - Perfection in design is achieved not when there is nothing more to add, but rather when there is nothing more to take away. Antoine de Saint-Exupéry