[Gauche-devel-jp] Re: main.c で Scm_PairClass が見つからない

Back to archive index

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







Gauche-devel-jp メーリングリストの案内
Back to archive index