• ベストアンサー

C言語 コンパイルできない "visa.h"読み込めない?

C言語でコンパイルすると 「error LNK2019: 未解決のシンボル _viOpen@20 が関数_mainで参照されました」 というエラーが出ます。 この viOpen という関数は"visa.h"というヘッダファイルに入っており、コンパイラしたソースファイルはメーカーからダウンロードしたファイルをコピーしているので間違っていること考えにくいです。 "visa.h"ファイルはincludeフォルダに入れたのですが入れるだけではだめなのでしょうか? また、 viOpen の中身を見てみると ViStatus _VI_FUNC viOpen (ViSession sesn, ViRsrcname, ViAccessMode mode,ViUInt32 timeout, ViPSession vi); と書いてありました。 これだけでは分からないかもしれませんが予測程度で構いませんので教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

例えば、viOpen は別の人が作ったモジュールで、部品です。一方、 質問者さんが作ったプログラムも一部です。実行時にはこれらが 合体していなければ正しく動作しませんね。 この「合体させる」のがリンクという作業です。先のエラーは部品 である viOpen が見つからないので、結合させられないという意味 です。 リンクには静的リンク(Static Link)と、動的リンク(Dynamic Link)の 2種類があります。.LIBは静的リンク用、.DLLは動的リンク用の ライブラリです。実際にはDLLを使う場合でもパラメータチェックの ために.LIBが用意されていることが普通です。逆に静的リンクしか 用意されていない場合は.LIBはあっても、.DLLはありません。 静的リンク、動的リンクの解説はこれらをキーワードにして検索 すれば、いろいろな解説が出てくると思います。 .DLLしかない場合は先に述べたようにLoadLibraryを使う方法しか ありません。各関数は以下を参照してください。 http://msdn.microsoft.com/ja-jp/library/cc429241.aspx http://msdn.microsoft.com/ja-jp/library/cc429133.aspx http://msdn.microsoft.com/ja-jp/library/cc429103.aspx もし、どう使うのか分からない場合は再度、質問してください。

xyz203
質問者

お礼

ご丁寧に有難うございます。 メーカーから貰ったライブラリのファイルを指定したらエラーが消えました。 ただ、今度は「ファイルが無効、もしくは壊れている」というエラーが出ました。 これについては質問内容と異なるので締め切ります。

その他の回答 (3)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

>保存場所はlibフォルダに入れればいいのでしょうか? .LIB のファイルならそうです。そのうえで、リンクのパラメータに 追記するか、以下のステートメントをソースに記入します。 #pragam comment(lib,"visa.lib") .DLL の場合はEXEと同じ所か、%SYSTEMROOT%\System32 に置くのが 普通です。この場合はLoadLibraryを使います。動的なロードなので、 関数は静的な呼び出しではなく、関数へのポインタを使ったものに なります。やり方はご存知ですよね? 不明な場合はGetProcAddress、FreeLibrary も調べましょう。

xyz203
質問者

お礼

回答有難うございます。 >>GetProcAddress、FreeLibraryも調べましょう。 C言語の入門書を手元に置いてやっているのですがlibやdllの記述について書かれていなかったです。もしよろしければ回答者さんの回答が理解できるような参考書があれば教えてもらえますでしょうか? 聞いてばかりで申し訳ないですがよろしくお願いします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

LoadLibraryを使って、自力でDLLをロードする場合以外では ライブラリをリンクしなければなりません。Cの標準ライブラリは リンクコマンドのパラメータに指定されているので、エラーになり ませんが、独自ライブラリはリンクのパラメータに加える必要が あります。visa.lib(名前のvisaは予想です)を持っていないと、 コンパイルはできますが、リンクが出来ず、ロードモジュールは 作成されません。上記の.LIBか.DLLを入手する必要があります。

xyz203
質問者

お礼

回答ありがとうございます。 .libか.dllを入手するとの事ですが保存場所はlibフォルダに入れればいいのでしょうか?

  • momenlara
  • ベストアンサー率60% (6/10)
回答No.1

>「error LNK2019: 未解決のシンボル _viOpen@20 が関数_mainで参照されました」 はリンク時のエラーですね。 ヘッダではなく、viOpenの実装が入っているライブラリファイルが見つからないのだと思います。

xyz203
質問者

お礼

早速の回答ありがとうございます。 >>ライブラリファイルが見つからないのだと思います。 との事ですがvisual stdio 8>>VC の libフォルダに何かファイルを入れればいいということでしょうか?

関連するQ&A

専門家に質問してみよう