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/lib包含的native_extension.c )将被完全忽略。

当我构建扩展时,只native_extension.{h,c} ,并且我得到了一个不完整的native_extension.{so,dll} ,当我尝试运行它时,它给出了符号查找错误。

有什么办法使这项工作?

虽然您可以将第二个参数传递给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)