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

Я хотел бы организовать исходный код 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} это дает мне ошибки поиска символов, когда я пытаюсь запустить его.

Есть ли способ заставить эту работу?

2 ответа

Решение

Пока вы можете передать второй аргумент make_makefile указать другой исходный каталог (например, make_makfile('native_extension', 'lib')), что бы не включать ваши native_extension.c файл. Если посмотреть на исходный код mkmf.rb, то, похоже, нет никакого способа заставить его выглядеть в обоих местах, кроме как переписать сгенерированный Makefile самостоятельно.

Вы можете использовать исходные файлы из других папок с "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)
Другие вопросы по тегам