1

別の会社から提供されたいくつかのライブラリ コードを分析しているときに、奇妙な構造 (おそらくエラー) に遭遇しました。ヘッダー ファイルで、関数は次のように宣言されました。

int funct(type1 var1, type2 var2, void* usr_arg);

(一般的な命名で申し訳ありません。NDA)しかし、ソースファイルでは同名の関数が次のように定義されていました:

int funct(type1 var1, type2 var2, long usr_arg)
{
    // code goes here;
}

そして最も興味深いのは、提供された makefile を使用してコンパイルすると、すべてが正常に動作することです。しかし、Eclipse プロジェクトを構成しようとすると、コンパイルが拒否され、上記の 2 つの関数ヘッダーが示されました。

今回使用したコンパイラは ubuntu の gcc ですが、ライブラリは Windows でも動作するはずです。どうすれば gcc にこの怪物を受け入れさせることができるでしょうか?

4

3 に答える 3

1

ソースを修正することをお勧めします (仮定: これが発生する場所は限られています)。関数が実際にポインターを使用して呼び出されると仮定すると (宣言のように)、次のように定義を変更できます。

int funct(int var1, int var2, void* usr_arg1) {
    long usr_arg = (long) usr_arg1;
    // code goes here;
}
于 2012-10-10T12:31:38.460 に答える
1

それほど奇妙ではありません.Makefileはおそらくgccに何らかのフラグを渡してそれを無視するか、単に警告を発行しますが、Eclipseプロジェクトはそうしません.またはEclipseプロジェクトのコンパイラフラグがより厳密である可能性があります. とにかく、関数宣言をその定義に一致するように変更することをお勧めします (または関数が実際に期待するものに応じてその逆)、エラーはなくなります。

于 2012-10-10T12:19:47.880 に答える
1

定義の場合、たとえば

 int funct(type1 var1, type2 var2, long usr_arg)
 {
  // etc
 }

ヘッダー宣言を含むファイルには表示されません

 int funct(type1 var1, type2 var2, void* usr_arg);

通常、GCC コンパイラはエラーを検出できません。

最近の GCC (つまり、GCC 4.6 または 4.7) のリンク時の最適化機能を使用することをお勧めします。つまり、コンパイル時とリンク時の両方で-fltoフラグ (いくつかの最適化フラグを使用) を渡します。

-fltowithの使用はお勧めしませんgcc-4.5。あなたは本当に少なくともGCC 4.6が欲しい

それを達成するための可能な方法は、実行することmake CC='gcc -Wall -flto -O2'です。これはおそらくそのエラーを発見したでしょう。

-flto各ソース ファイルをコンパイルするときと、すべての拡張オブジェクト ファイルを実行可能ファイルまたはライブラリにリンクするときに、いくつかの最適化が行われるため、ビルド時間が遅くなることに注意してください。

コードベースが十分に重要な場合は、そのような目的のために GCCのMELT拡張を開発することを検討できます (MELT は GCC を拡張するための高レベルのドメイン固有言語です)。

于 2012-10-10T12:19:50.613 に答える