わたなべです。

米倉正和 <masakazu / remus.dti.ne.jp> writes:

> Cygwin版のRubyで自分で作った拡張ライブラリをコンパイルすると
<中略>
> gcc -shared -s -Wl,--enable-auto-import,--export-all -L'/usr/local/lib'
> -o opencv.so opencv.o point.o matrix.o iplimage.o -lruby -lhighgui
> -lopencv -lstdc++ -lcrypt
> matrix.o(.text+0x172):matrix.cpp: undefined reference to
> `st_init_numtable()'
> collect2: ld はステータス1で終了しました
> make: *** [opencv.so] エラー1
> 
> と言われてコンパイル出来ないのですがどうしたらいいのでしょうか。

適宜extern "C"を使ってください。

extern "C" { 
  #include <st.h>
}

> 他の環境(FreeBSDやLinux)ではこれで問題ないのですが…。

--allow-shlib-undefinedがdefaultだからです。
FreeBSDやLinuxでもrequireするとエラーになりませんか?

あとはちょっとした助言を。

> $objs = ["opencv.o", "point.o", "matrix.o", "iplimage.o"]

他に余計なソースファイルがないなら、$objsで登録する必要はあ
りません。

> $CFLAGS = "-I/usr/local/include/opencv"
> $LDFLAGS = "-L/usr/local/lib"

移植性を考えるならdir_config("opencv")を入れて外から指定でき
るようにしたほうがいいでしょう。

> ['stdc++', 'opencv', 'highgui'].each{|lib|
> exit(1) unless have_library(lib)
> }
> create_makefile("opencv")

stdc++だけは別にしたほうがいいでしょう。
GCC以外の処理系で困ります。

have_library('stdc++')

if %w(opencv highui).all?{|lib| have_library(lib)}
  create_makefile("opencv")
end

-- 
わたなべひろふみ