mkmf игнорирует файлы во вложенных папках при компиляции расширения C.

#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 самостоятельно.