dSPACEコンパイラリンカエラー - fscanfが未定義


4

私はやや手に負えない問題を扱っています。 MATLAB 2011a上でdSPACE 7.4(RTI 1006)を実行しています。これは、dSPACE DS1006 Cコンパイラv.2.2を使用していることを理解しています。私たちのモデルの1つをコンパイルしようとすると、fscanfが未定義であることを宣言するリンカエラーが発生します(カスタム関数で呼び出されています)。私は、stdio.hがシステム階層のどこにあるべきか、fscanfの定義が含まれていることを確認しました。問題を解決するために私が取ったステップは次のとおりです。

  • リンカは未定義のfscanf()について最初に文句を言う
  • 私はそれがコンパイルされることを私が知っているところでモデル特有のファイルに挿入された追加の定義はリンカにfscanf()のための矛盾した定義について不平を言わせます
  • stdio.hのfscanf()定義をコメントアウトすると、コンパイル/リンクが成功する
  • stdio.hにスタブ定義を挿入し、オリジナル(およびモデル固有のファイルではスタブ)をコメントアウトすると、 'fscanfの複数の定義'エラーが発生します(これはストーリー全体の最も奇妙な部分です)。

スタブの定義(これは私たちのモデルを壊すべきではないと私は確信していますが、これを検証する機会はまだありません)

int fscanf(int a, char *cp, void *b, ...){return 0;}

ですから、正しく読んでいるのであれば、fscanfのバージョンであり、実際にはfscanfが実行すべきことを実行しません。要約すると、私はこのモデルを構築するために私のコンパイラのライブラリをハックしなければなりません、そしてそれが現時点で私たちのハードウェア上で動くとは全く確信していません。また、dSPACEのインストールを変更してfscanfを中断するようにオフィスの全員に指示したくありません。

誰かが私にこれについてのいくつかの洞察を与えることができますか?

更新:それは確かに私たちのハードウェアで動きます。しかし、私はfscanf()を壊すのは嫌いなので、これを解決したいのです。


これは工学的な問題ではなくプログラミング上の問題のようです。
hazzey

多かれ少なかれ本当ですが、私は自動車工学以外の誰にも使用されそうにない自動車業界特有のソフトウェア/ハードウェアパッケージを実行しているので、これはそれを尋ねるのに最も良い場所のようでした。
ZStamler

stdio.hは必要なヘッダファイルです。 コンパイル コーディングする。に リンク つまり、リンカには「ランタイムライブラリ」が必要です。 fscanfの正しいバージョンで。 Matlab版のfscanf()は標準のC版と同じではないことに注意してください。2つの版をどうにかして一致させようとしているように見えますが、うまくいきません。
alephzero

まあ、それは本当である可能性が非常に高いです。残念ながら、製造元からの具体的なドキュメントがないと、リンカが使用するディレクティブをどこに含めるべきかを判断するのは非常に困難です。ここでfscanf関数をコメントアウトするとコードをコンパイルできるように、stdio.hというCヘッダーファイルが使用されていることはわかります。しかし、リンカが何らかの理由で関数のMATLABバージョンにアクセスしようとしているのであれば、この時点では驚きません。
ZStamler

1
あなたはほとんど得ることができます 何でも ヘッダファイルをまったく含まないことで「コンパイル」すること - しかし、それが正しい方法であるとは限りません。あなたがドキュメンテーションやサポートなしで製品の代金を払った場合、あなたは私見を詐欺しました。
alephzero

回答:


0

これはおそらく以前はうまくいきました。したがって、基本的な最初のステップは、あなたがそれを既知の良好な状態に戻すまで行った(あなたがソース管理を使用しているのですか?)すべての変更を後退させることです。

そこから、あなたが行った変更を調べる必要があります。 Cは、異なるメソッドシグネチャを持つ限り、同じ名前を持つメソッドをサポートします。すなわち入力パラメータは2つの方法で異なる必要があります。

Cでは、2つの異なる分野でこれら2つの同じ名前のメソッドを定義することもできます。だからあなたは標準を使用することができます fscanf あなたが遭遇したこのカスタム実装と同様にメソッド。

あなたが言及した定義:
int fscanf(int a, char *cp, void *b, ...){return 0;} あなたが問題を抱えている可能性があります。そして、あなたはおそらく追加の定義を持っています fscanf 標準のlib定義を超えています。そして2つの「自家製」 fscanf メソッドは、競合するメソッドシグネチャを持つ可能性があります。の ... 4番目のパラメータは、メソッドが可変数の入力を受け取ることができることを示します。私の一番の推測は別のものがあるということです fscanf 4つの入力が定義され、その後に可変入力標識が続く定義。

一言で言えば - 狩り すべて あなたのアプリケーションであなたが持っている定義のうち fscanf。そこに競合する定義とリンカエラーの原因があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.