- ベストアンサー
BorlandC++Builder5.0でリンカエラー
- BorlandC++Builder5.0のA/D変換ボード制御でリンカエラーが発生
- リンカエラーの原因は外部シンボル 'AdOpen' の未解決である
- リンカエラーが発生する原因として、ボードのインストールに問題がある可能性がある
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> [リンカ エラー]'FBIAD.LIB' contains invalid OMF record, type 0x21 (possibly COFF) > > さっぱりわかりません(^^;) コンパイルしたもの(.objなど)には、決められたフォーマットが幾つかあって、 それが期待したのと違う(OMF というフォーマットで読もうとしてるんだけど、 タイプが違う、もしかしたら COFF というフォーマットかも)ということみたい。 多分 VC++ だったらいけると思う。 もしくは、変換ツール(coff2omf みたいな)が BC++ についてるとか。 A/D変換ボード用のライブラリは、DLL で提供されているものなんでしょうか? であれば、implib で、インポートライブラリを DLL から作り直しましょう。
その他の回答 (2)
- a-kuma
- ベストアンサー率50% (1122/2211)
> Windows\SYSTEMにインストールされていたFbiAd.dllからimplibでFbiAd.libを作り、リンクさせた所、バッチリ動きました。 > しかし、普通はVC++でDLLを提供するものなのですか?Borlandはマイナーなのかなぁ... 解決したようで良かった。 提供の形態に、どれが普通なのか、は一概に言えませんが、形態を決める一番大きい 理由は、「提供者が、どの開発環境を持っているか?」だと思います。 開発用のライブラリであれば、利用者が広がれば、その要求に応えるために、両方の ライブラリが提供されているケースはあります(例えば、lzh 展開用の UNLHA なんか)。 また、バイナリだと、どうしてもそういうケースはありますから、ソースで提供され ている、とかね。 かくいう私も、BC++ は(雑誌の付録のCDなんかで)持ってはいるものの、使ったことが ありません。必要があれば、使うつもりはあるんですけどね。
- a-kuma
- ベストアンサー率50% (1122/2211)
原因として、考えられることを二つほど。 ・AdOpen()を持っているライブラリをリンクのときに指定していない 質問の書き方が、ちょっとプログラムを知っている人のようなので、こういうミスは 無いだろうな、と想像します。本命は、こちら。 ・AdOpen() は C の関数であり、そのプロトタイプ宣言が適切にされていない 細かく分類すると、 ・提供されているインクルードファイルをインクルードしていない ・提供されているインクルードファイルが C++ で使うことを想定されて書かれていない ・そもそもプロトタイプ宣言が書いてあるインクルードファイルが無くて、自分でも宣言していない の三種類があります。 C++ は、関数のオーバーロード(引数の型や個数が違えば、同名の関数でも異なった 実装ができる)の仕組みを持っているので、いわゆる C の関数とは区別されます。 AdOpen() の引数は、(私には)想像するしかないんですが、例えば、以下のような プロトタイプ宣言が、(自分で書くかどうかは別にして)どこかに必要です。 extern "C" int AdOpen(const char*);
補足
回答ありがとうございます。 リンクのとき指定というのは、どういうことですか?プロジェクトに.libを追加してこの問題はなんとか解決できましたが、またエラーが出てしまいしました。 [リンカ エラー]'FBIAD.LIB' contains invalid OMF record, type 0x21 (possibly COFF) さっぱりわかりません(^^;) 今は学生です。卒業研究でA/Dコンバータを使わないといけないのですが、初期化の段階で詰まってしまっています。
お礼
ありがとうございました!無事解決しました(^^) 何とかこれで卒研が先に進めそうです。この調子だと前途多難ですが(笑) 今までDLLとLIBとかの関係が分からなかったのですが、何となく分かった気がします。 Windows\SYSTEMにインストールされていたFbiAd.dllからimplibでFbiAd.libを作り、リンクさせた所、バッチリ動きました。 しかし、普通はVC++でDLLを提供するものなのですか?Borlandはマイナーなのかなぁ...