プロが教える店舗&オフィスのセキュリティ対策術

現在、C言語の中で疑似逆行列を用いた最小2乗法によって
データの処理を行いたいと考えています。
そのためにCLapackという線形演算ライブラリを
visual studio 6.0に組み込みたいのですがうまくいきません。
研究で、ADボードやロボットマニピュレータを使うために 
Win32 Application で自分でプログラムを書いています。

Win32 Console Application にCLapackを組み込む事は、
http://www.alab.t.u-tokyo.ac.jp/~bond/doc/clapac …
を見てうまくいったのですが、Win32 Applicationで組み込もうとすると、以下のようなエラーがでます。

リンク中...
LINK : warning LNK4049: ローカル定義のシンボル "_free" がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル "_fprintf" がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル "__iob" がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル "_malloc" がインポートされました
LINK : warning LNK4049: ローカル定義のシンボル "_exit" がインポートされました
clapack.lib(dlamch.obj) : error LNK2001: 外部シンボル "__imp__printf" は未解決です
clapack.lib(xerbla.obj) : error LNK2001: 外部シンボル "__imp__printf" は未解決です
Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー


プログラムに関する知識が乏しいため、解決できません。
またmath.hをインクルードすると大量のエラーがでます。

CLapackについて詳しい方がいらっしゃいましたら、
どうか教えていただけないでしょうか?
よろしくお願いします。

A 回答 (2件)

おはようございます.



CLAPACKのエラーというよりは
「Win32のGUIに標準入出力ライブラリを組み込もうとした」為のエラーという気がします.
CLAPACKは処理がコケると標準出力にエラーを出してくれるのですが,
ここで要求される関数がリンク時に未解決であるという意味に読めます.
GUIアプリケーションを作るなら普通はprintfなどとせずに,
メッセージボックスを作りますよね?
だから初期設定ではこうしたものはリンクされないようになっているのでは?

余談ですが…
擬似逆行列を陽に計算するのは無駄なのではないですか?
dgels_ を使った方が良いのでは?

この回答への補足

早速の回答ありがとうございます。

たしかに私のプログラムでは、ダイアログボックスで、
MessageBoxやGetDlgItemなど関数を使っています。
このような場合にCLapackを使うことは難しいのでしょうか?

また
>擬似逆行列を陽に計算するのは無駄なのではないですか?
>dgels_ を使った方が良いのでは?
についてですが、僕の言葉足らずですいません。
CLapackを組み込めたら、疑似逆行列は使わずにdgels_という関数を使うつもりです。最小2乗法によってパラメータが推定出来ればどんな方法でも大丈夫です。

補足日時:2008/11/22 11:41
    • good
    • 0

こんにちは.



私はWindows上ではコンソールで少しCLAPACKを触った程度なのですが…アドバイスを.
おそらく,上記のエラーはCLAPACKの問題ではありません.
「WindowsのGUIプログラムで標準I/Oが使えるか?」という問題になってくると思います.

理由はエラーの内容が「Linkエラー」だからです.
コンソールプログラムを「コンパイルして」実行ファイルを作るときに,
「printf()」というあなたが書いていない関数の機能が使えるのは,
あなたのプログラムを「コンパイルして」半分機械語にした後に,
printf()の入った半分機械語のファイルが結合されるからです.
この過程を「リンク(link)」といいます.
このように,「みんなが使う機能」をまとめておいて,後でリンクするものをライブラリなどと言ったりします.
ここで,printf()はC言語の「標準ライブラリ」の標準I/O関数の一つです.
コンソールアプリケーションでは
「実行ファイルを作るためには最後に標準ライブラリをリンクせよ」という設定になっているから,
無事に実行ファイルが作られるのでしょう.
ですが,通常のGUIプログラムではprintf()などは使わないでしょう,
だから,初期設定では標準ライブラリをリンクする設定にはなっていないと思われます.
結果,実行ファイルを作るときにこれがリンクされずに,
「要求された関数が何処にも無かった!(未解決)」とLinkエラーが出るわけです.

ただし,ライブラリのリンクの問題だけか,というとそうでもないです.
GUIのプログラムでprintf()としたときに出力が何処に飛んで行くか,
と言われると一寸分からないので,一旦閉じて再度他の形で質問されたらどうでしょうか.
    • good
    • 0
この回答へのお礼

詳しいご説明ありがとうございます!!

いろいろ考えた結果、
結局、GUIのプログラムでCLAPACKを使うのは大変そうなので、
自力で疑似逆行列を求めるプログラムを書いてみることに決めました。

マニアックな質問に丁寧に答えて頂いたのに、申し訳ありません。

ただechoes_x86の回答のおかげで自分でプログラムを書いてみよう
と選択肢にたどり着くことができました。
そして、パラメータの推定は何とかなりそうです。

echoes_x86さんにはほんとに感謝しています。
ありがとうございます!!

お礼日時:2008/11/24 12:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!