#c #ruby #mkmf #ruby-c-extension
#c #ruby #mkmf #ruby-c-extension
Вопрос:
Я бы хотел организовать исходный код C следующим образом:
/
|
|___ ext
| |
| |___ native_extension
| |
| |___ lib
| | |
| | |___ (Source files are kept in here - may contain sub-folders)
| |
| |___ native_extension.c
| |___ native_extension.h
| |___ extconf.rb
|
|___ lib
| |
| |___ (Ruby source code)
|
|___ Rakefile
У меня возникли проблемы с корректной работой этой настройки mkmf
. Файлы native_extension/lib
, которые включены в native_extension.c
, полностью игнорируются.
Когда я создаю расширение, компилируются только native_extension.{h,c}
, и я получаю неполный native_extension.{so,dll}
, который выдает мне ошибки поиска символов при попытке его запуска.
Есть ли способ заставить это работать?
Ответ №1:
Вы можете использовать исходные файлы из других папок с помощью «extconf.rb» следующим образом:
require 'mkmf'
extension_name = 'native_extension'
dir_config(extension_name)
# enum all source files
$srcs = ["native_extension.c", "lib/file.c"]
# add include path to the internal folder
# $(srcdir) is a root folder, where "extconf.rb" is stored
$INCFLAGS << " -I$(srcdir)/lib"
# add folder, where compiler can search source files
$VPATH << "$(srcdir)/lib"
create_makefile(extension_name)
Ответ №2:
Хотя вы можете передать второй аргумент make_makefile
, чтобы указать другой исходный каталог (например, make_makfile('native_extension', 'lib')
), это приведет к тому, что он не будет включать ваш native_extension.c
файл. Глядя на исходный код mkmf.rb, кажется, что нет никакого способа заставить его выглядеть в обоих местах, кроме как переписать созданный Makefile самостоятельно.