1

问题

我对动态库和静态库的区别有一个直观的理解。也就是说,我正在尝试编写一个使用第三方库的 C 扩展。我已经静态和动态地编译了这个库,并在我的 extconf.rb 中引用了静态库。为了清楚...

A = 3rd 方动态库(理论上未使用)
B = 3rd 方静态库(在 extconf.rb 中引用)
C = Ruby C 扩展

事情是这样的:当我在我的 ruby​​ 代码中需要 C 时,我得到一个错误。如果 A 在当前工作目录中,则不会引发此错误。奇怪。在当前工作目录中有 B 似乎使 ruby​​ 感到困惑,它找不到 A。

理想情况下,我希望系统上根本不存在 B。我想把它全部隐藏在 C 中。这就是我认为静态库所做的。这是可能的吗?如果可以,它是如何完成的?

上下文集

Windows7、Ruby2.0、DevKit、MinGW。第 3 方库是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>'
4

0 回答 0