• ベストアンサー

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

  • DB2付きのC言語がコンパイルできません。

    CはMicrosoftVisualStudio2012 DBはIBM DB2 です。 同じ環境でコンパイル実行できていたのに、 PCがおかしくなったのでフォーマットして入れなおしたらコンパイルができなくなりました。 よろしくおねがいします。 ソースはこちらです。 #include <stdio.h> exec sql include sqlca; void main() { exec sql connect to sample; if(SQLCODE!=0) { printf("SQL CONNECT %d", SQLCODE); } else { exec sql update Test1 set col2 = 'bababa'; if(SQLCODE!=0) printf("SQL UPDATE %d", SQLCODE); } exec sql connect reset; } コンパイルコマンドです db2 connect to sample db2 prep Test11.sqc bindfile db2 bind Test11.bnd cl -Z7 -c -W2 -D_X86_=1 -DWIN32 -I"c:\Program Files\IBM\SQLLIB\include" Test11.c link -debugtype:cv -outTest11.exe %1.obj "c:\Program Files\IBM\SQLLIB\lib\db2api.lib" エラーメッセージです Test11.obj : error LNK2019: 未解決の外部シンボル _sqlaaloc@16 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlacall@20 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlasetdata@24 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastop@4 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastrt@12 が関数 _main で参照されました。 Test11.exe : fatal error LNK1120: 5 件の未解決の外部参照

  • コンパイルできない C++

    以下エラーでC++のソースがコンパイルできない fatal error C1083: include ファイルを開けません。'gimite/socket.h': No such file or directory ヘッダーファイルには添付のようにgimite/socket.hを追加済みです

  • C++での <iostream.h>と<iostream>とusingnamespaceの関係等を教えてください。

    どうでもいい質問なのですが… C++で色々とソースを打っていると気づいたのです。 #include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。 また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。 だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。 なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。

  • 分割コンパイルの方法がわかりません‥(Studio.NET)

    mainとsubという2つのcppファイルと各ヘッダファイルで分割コンパイルを試みましたがうまくいきません・・。 何が間違っているのでしょう・・。 エラーメッセージ error LNK2005: "char * a" (?a@@3PADA)は既にmain.objで定義されています。 fatal error LNK1169: 1つ以上の複数回定義されているシンボルが見つかりました。 と表示されます。ファイルソースは以下です。どなたか教えてください>< ----------(main.h)---------- char a[100]; ----------(main.cpp)---------- #include<stdio.h> #include "main.h" #include "sub.h" int main(){  sprintf(a,"hello.");  sub_write();  return 0; } -----------(sub.h)----------- void sub_write(); -----------(sub.cpp)------------- #include <stdio.h> #include "main.h" #include "sub.h" void sab(){  printf("%s\n",a); } return; }

  • コンパイルエラー

    VCでファイル(.c)をコンパイルしたところ 以下のエラーが出てしまいました。 error LNK2019: 未解決の外部シンボル _sqlcxt が関数 _xxxxxxxx で参照されました。 なんかの設定不足でしょうか? お分かりの方がおりましたら、よろしくお願いします。

  • C言語 コンパイルエラー(文字列または文字定数が閉じていない)

    下記コードでコンパイルすると、コンパイルエラーとなります。試しに、"さようなら"を、"さような"に変更すると、コンパイルエラーは なくなります。どうして、コンパイルエラーとなるのか分からずに困っています。ちなみに、コンパイラは、ボーランドのものを使っています。 ▼エラーとなるコード #include <stdio.h> int main(void) { printf("こんにちは"); printf("さようなら"); return 0; } ▼コンパイルエラー内容 エラー E2380 sample08.c 7: 文字列または文字定数が閉じていない(関数 main ) エラー E2121 sample08.c 9: 関数呼び出しに ) がない(関数 main ) 警告 W8070 sample08.c 10: 関数は値を返すべき(関数 main )

  • C言語でレジストリ取得「未解決の外部シンボル」

    C言語でレジストリを取得する時に「未解決の外部シンボル」エラー レジストリを取得したくて、下記のコードで実行したら、 ====================================================================== #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <shlwapi.h> int main(void) { char Value[1000]; DWORD ValueSize; char *DefaultValue = ""; ValueSize = 1000; /* HKEY_LOCAL_MACHINEのSoftware\masapicoというキーにあるfooという名前のレジストリ値を取得 */ SHRegGetUSValue( "Software\masapico", "foo", NULL, Value, &ValueSize, FALSE, DefaultValue, lstrlen(DefaultValue) + 1); /* 結果を表示 */ printf("%s\n", Value); return 0; } ====================================================================== こういうエラーが出ます。 1>コンパイルしています... 1>testExe.cpp 1>リンクしています... 1>testExe.obj : error LNK2019: 未解決の外部シンボル _SHRegGetUSValueA@32 が関数 _main で参照されました。 1>I:\testExe\Debug\testExe.exe : fatal error LNK1120: 外部参照 1 が未解決です。 いろいろ調べましたが原因はわからず困っています。 Javaはある程度やってましたが、Cに関しては初心者です。 環境は Win7 64bitです。 WinXPの環境でコンパイルしても同じ現象です。 その時のエラーは error LNK2019: 未解決の外部シンボル _SHRegGetUSValue が関数 _main で参照されました。

  • stdafx.hについて

    http://homepage2.nifty.com/igat/igapyon/diary/2006/ig061108.html 上記URLにあるソースをBorlandC++コンパイラでコンパイルしたのですが、 「インクルードファイル 'stdafx.h' をオープンできない」というエラーが発生します。 どうしたらこのソースは動くのでしょう? stdafx.hとは何をしているヘッダーなのかも教えてもらえないでしょうか? よろしくお願いします。

  • C言語のPathFileExistsについて

    visual studio 2010、C言語でPathFileExistsを使って ファイル有無のチェックをしようと試みましたが、 コンパイルエラーになってしまいました。 環境はwindowsXP、SP3です。 参考にしたいくつかのサイトでは、visual studio 2010ではPathFileExistsを使って ファイル有無をチェックできると書いてあったのですが、 visual studio 2010でもC言語だとPathFileExistsは使えないのでしょうか? TEST.C #include <stdio.h> #include <shlwapi.h> int main() {   char path[128];   sprintf( path, "c:\\tmp.txt" );   if ( PathFileExists(path) ){     printf("ファイル有\n");   }   else{     printf("ファイル無\n");   }   return 0; } TEST.OBJ : error LNK2019: 未解決の外部シンボル __imp__PathFileExistsA@4 が関数 _ main で参照されました。 TEST.EXE : fatal error LNK1120: 外部参照 1 が未解決です。 NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 10.0\VC\BI N\link.exe"' : リターン コード '0x460' Stop.

  • condefs.hはどこにあるの?

    #include <stdio.h> #include <windows.h> #ifdef __BORLANDC__ #include <condefs.h> #endif をヘッダに含むプログラムspitest.cppを無償コンパイラのボーランドC++5.5でコンパイルすると Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland spitest.cpp: エラー E2209 spitest.cpp 8: インクルードファイル 'condefs.h' をオープンできない *** 1 errors in Compile *** とエラーがでました。 どうしたらいいのでしょうか?