Использование SWIG 2.0.4 с Ruby 1.9.2 для запуска примера класса SWIG - PullRequest
0 голосов
/ 05 марта 2012

Я просто пытаюсь использовать пример ruby, который оборачивает класс из пакета библиотеки SWIG. Вот что я сделал:

  • Загруженный Ruby 1.9.2 для mswin32 отсюда: http://ftp.ruby -lang.org / pub / ruby ​​/ binaries / mswin32 /
  • Загруженный SWIG 2.0.4 отсюда: http://www.swig.org/download.html
  • После преобразования файла проекта в MS Visual Studio 2010 и корректировки путей мне удалось скомпилировать dll с файлом example_wrap.cxx. Это дало мне хорошую DLL с одной экспортированной функцией инициализации. Насколько я знаю, это совершенно нормально.

Проблема, с которой я столкнулся, заключается в том, что я не могу использовать прикрепленный скрипт ruby, чтобы связать его с dll и использовать его. Вот рубиновый файл:

# file: runme.rb

# This file illustrates the C++ interface created by SWIG.
# All of our C++ classes get converted into Ruby classes.

require 'D:/Work/TUS_Work/temp/SWIG/class/example'

# ----- Object creation -----

print "Creating some objects:\n"
c = Example::Circle.new(10)
print "    Created circle #{c}\n"
s = Example::Square.new(10)
print "    Created square #{s}\n"

# ----- Access a static member -----

print "\nA total of #{Example::Shape.nshapes} shapes were created\n"

# ----- Member data access -----

# Set the location of the object

# Notice how we can do this using functions specific to
# the 'Circle' class.
c.x = 20
c.y = 30

# Now use the same functions in the base class
s.x = -10
s.y = 5

print "\nHere is their current position:\n"
print "    Circle = (", c.x, ",", c.y, ")\n"
print "    Square = (", s.x, ",", s.y, ")\n"

# ----- Call some methods -----

print "\nHere are some properties of the shapes:\n"
for o in [c, s]
  print "    #{o}\n"
  print "        area      = ", o.area, "\n"
  print "        perimeter = ", o.perimeter, "\n"
end
# Notice how the Shape#area() and Shape#perimeter() functions really
# invoke the appropriate virtual method on each object.

print "\n", Example::Shape.nshapes," shapes remain\n"
print "Goodbye\n" 

Ошибка, которую я получаю после запуска интерпретатора ruby ​​с этим файлом в качестве параметра:

ruby.exe -I. runme.rb
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
D:/Work/TUS_Work/temp/SWIG/class/example (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from runme.rb:6:in `<main>'

Я создал файл example.rb внутри, который был «найден» и загружен, но dll не найден, даже если я укажу полный путь и / или расширение файла.

Кто-нибудь еще испытывал эту проблему и нашел решение? Я думаю, что причина в том, что ruby ​​версии 1.9.x, возможно, изменил API и потерял совместимость со старым кодом, поэтому этот простой пример больше не работает. Но я пока не смог найти ответ на эту проблему.

1 Ответ

1 голос
/ 19 марта 2012

Require не занимает полный путь (или, по крайней мере, он не должен использоваться таким образом). Попробуйте это так:

require 'example'

Чтобы Ruby мог найти файл, он просматривает некоторые предопределенные каталоги и каталоги, указанные в параметре командной строки -I. Вы можете проверить это, поставив перед требованием следующее:

puts $LOAD_PATH

Должен быть указан каталог, в котором находится пример, иначе он не будет найден. Так что попробуйте следующее:

ruby.exe -I. -ID:/Work/TUS_Work/temp/SWIG/class runme.rb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...