2011-10-08 61 views
4

我想组织这样的C源代码:MKMF忽略子文件夹中的文件时,它编译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.c包含的native_extension/lib中的文件正被完全忽略。

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

任何方式使这项工作?

回答

3

虽然您可以将第二个参数传递给make_makefile以指定不同的源目录(例如make_makfile('native_extension', 'lib')),但这会导致它不包含native_extension.c文件。看看mkmf.rb的源代码,看起来没有什么办法可以让它在两个地方看起来都不用重新编写生成的Makefile。

2

您可以从另一个文件夹使用源文件与“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)