2011-10-08 57 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)