8

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

この設定をで正しく機能させるのに問題がありますmkmfnative_extension/libに含まれているのファイルはnative_extension.c完全に無視されています。

拡張機能をビルドすると、コンパイルされるだけで、実行しようとするとシンボルルックアップエラーが発生native_extension.{h,c}する不完全なメッセージが表示されます。native_extension.{so,dll}

これを機能させる方法はありますか?

4

2 に答える 2

10

次のように、「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)
于 2016-03-07T11:09:24.633 に答える
4

2番目の引数を渡してmake_makefile別のソースディレクトリ(たとえばmake_makfile('native_extension', 'lib'))を指定することはできますが、その場合、ファイルが含まれなくなりnative_extension.cます。mkmf.rbのソースを見ると、生成されたMakefileを自分で書き直す以外に、両方の場所でそれを表示する方法はないようです。

于 2011-10-09T19:29:17.557 に答える