我对动态库和静态库之间的区别有直观的了解。也就是说,我正在尝试编写一个使用第三方库的C扩展。我已经静态和动态地编译了这个库,并且我在extconf.rb中引用了静态库。为清楚起见......
A =第三方动态库(理论上未使用)
B =第三方静态库(在extconf.rb中引用)
C = Ruby C extension
这是事情:当我在我的ruby代码中需要C时,我收到错误。如果A在当前工作目录中,则不会抛出此错误。奇怪的。在目前的工作目录中使用B似乎会混淆ruby并且找不到A.
理想情况下,我希望根本没有B出现在系统上。我想将它全部隐藏在C中。这就是我认为静态库所做的。这是可能的,如果可以的话,它是如何完成的?
Windows7,Ruby2.0,DevKit,MinGW。第三方库是CGAL,而后者依赖于boost,mpfr和gmp。该扩展程序旨在与SketchUp的ruby API一起使用。 SketchUp ruby扩展通过SketchUp接口安装,该接口只是将相关文件复制到它选择的目录并加载它们。我的extconf看起来如下:
#extconf.rb
require 'mkmf'
dir_config("CGAL", "C:/CGAL-4.2/include", "C:/CGAL-4.2/bin")
have_library("CGAL")
dir_config("boost", "C:/boost/boost_1_54_0", "C:/boost/boost_1_54_0/stage/lib")
have_library("boost_thread-mgw47-mt-1_54")
have_library("boost_system-mgw47-mt-1_54")
dir_config("gmp", "C:/CGAL-4.2/auxiliary/gmp")
create_makefile( 'HW' )
当找不到libCGAL.dll时,我得到以下输出。将它放在当前的工作目录中可以解决这个问题。
test.rb:2:in `require_relative': 126: No se puede encontrar el módulo especificado. -
C:/Users/Noel/code/tru-offset/HW.so (LoadError)from test.rb:2:in `<main>'