在Windows下用C++编写Ruby扩展,原生编译工具使用的是GCC,连接得到动态库直接或间接依赖于libstdc++-6.dll、libgcc_s_seh-1.dll和libwinpthread-1.dll,这在运行时是极大的障碍。通过探索,可以使用GCC的编译连接开关回避它:
-Wl,-Bstatic -lstdc++ -lgcc_eh -lpthread -Wl,-Bdynamic
于是mkmf的文件大概如下:
require 'mkmf'
$libs = '-Wl,-Bstatic -lstdc++ -lgcc_eh -lpthread -Wl,-Bdynamic'
create_makefile('MyRubyExt')
之后就用常规手段能编译出动态链接库用于Ruby原生扩展。
mingw32之下又是完全不同的景象,特此记录参数:
-static-libstdc++ -static-libgcc -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive -Wl,-Bdynamic