Shiro Kawai
shiro****@lava*****
2004年 6月 27日 (日) 18:02:53 JST
From: shelarcy <shela****@capel*****> Subject: [Gauche-devel-jp] main.c で Scm_PairClass が見つからない Date: Sun, 27 Jun 2004 17:36:43 +0900 > Boost.Build で分けてコンパイルしているのが悪いのか…… > > C:/develop/Gauche-0.8/boost/../src/main.c:302: undefined reference to > `Scm_PairClass' > > とのエラーがでますが、gauche.h で定義されているのに Scm_PairClass > が見つからないってことはないですよね。 > > では Scm_PairClass の定義はどこに? Scm_PairClassの「定義」はlist.cにあります。 (gauche.hにあるのはScm_PairClassの「宣言」) list.objはlibgauche.dllに含まれて、goshはmain.objとlibgauche.dllを リンクするなりますから、一番ありそうなのは、goshのリンク時にlibgauche.dll が含まれていないことですね。上記エラーが出る際のコマンド (gccかg++を キックしているコマンドライン) はわかりますか? 上記コマンドラインに-lgaucheが入っているとすれば、DLLがちゃんとビルド されていないという話になります。 DLLのシンボル参照の解決はなんだかややこしくて、私もちゃんとは理解して いないんですが、cygwinではDLLのリンクには、DLL側にexportするシンボルを リストしたスタブが埋め込まれ、またDLL本体とは別にimportライブラリなる ものが作られます。そのため、以前のcygwinではリンク時にgccを3回走らせる 必要がありました。最近はgcc自身にautoimport, autoexportという機能が 組み込まれて、複数パスを勝手にやってくれるみたいです。 mingwでそのあたりの話をどう解決しているのかが気になります。 とりあえず、非常に単純なプログラムで、Boost.Build経由のmingwを使った DLLのビルドと外部データシンボルの参照ができるかどうかを確認するのが 第一歩ではないでしょうか。例えば次のような2つのファイルを用意しといて: file: foo.c int foo_data = 1; file: main.c #include <stdio.h> extern __declspec(dllimport) int foo_data; int main(int argc, char **argv) { printf("%d\n", foo_data); } foo.cからlibfoo.dllをビルドし、main.cの方でそれをリンクしてfoo_dataが 参照できるかどうか、ってことですね。 --shiro