0

freedup と呼ばれる重複ファイルをハードリンクするためのプログラムをコンパイルしようとしています。私はプログラムの作者/管理者に電子メールを送ろうとしましたが、それから長い時間が経ち、彼から何も連絡がありません.

gcc (3.4.4-999) と make (3.81-2) の最新の安定バージョンを使用して、cygwin 環境からプログラムをコンパイルしようとしています。すべてのオブジェクト ファイルを削除して make を実行しようとしましたが、常に次のエラーが発生します。

freedup.o: 関数 'main' 内:
/home/[user]/freedup-1.5/freedup.c:1791: '_hashed' への未定義の参照
collect2: ld が 1 の終了ステータスを返しました make: * * * [freedup] エラー 1

ソースコードを調べたところ、「ハッシュされた」関数がインライン関数であることがわかりました(ソースファイルの外で宣言する必要はないと思いました...しかし、それは予備のグーグルから集めたものです)。

このプログラムを Windows 環境でコンパイルしてみて、運が良ければ、本当に感謝します。ありがとう

ソース ファイルへの直接リンクは次のとおりです: http://freedup.org/freedup-1.5-3-src.tgz

4

2 に答える 2

2

#include <linux/stat.h>「 」の代わりに「 」を使用するコードには感銘を受けません#include <sys/stat.h>。また、version.h ファイルに次のコードが含まれていることにも感銘を受けません。

-e #define VERSION "1.5-3"

(そのファイルはコマンド - ' echo -e '#define...' > version.h' によって生成されます。うーん!)

関数を次のように変更した場合:

inline int hashed(const char*s)
{
    int returnval=atoi(s);

    if(returnval>2) returnval=2;
    if(returnval<0) returnval=0;
    return returnval;
}

に:

static
inline int hashed(const char*s)
{
    int returnval=atoi(s);

    if(returnval>2) returnval=2;
    if(returnval<0) returnval=0;
    return returnval;
}

(そして、上記で言及された他の問題を修正します)、GCC "i686-apple-darwin10-gcc-4.2.1(GCC)4.2.1(Apple Inc.ビルド5646)(ドット1 )」。

/bin/touch (MacOS X では /usr/bin/touch です) でのタッチを想定しているため、テスト コードはランダムなポイントで失敗します。'auto.h' は 4 つの関数を 'const int' ('int' のさまざまな装い) を返すものとして定義しているため、'関数の戻り値の型で無視される型修飾子' についても多くの警告があります。同じヘッダー。

これは、作成者側の経験不足、またはテスト済みのプラットフォームが不十分であることが原因だと思います。version.h コマンドでは、タブを使用する必要はありません (' ' は、コマンド ラインの-e' ' 表記を展開するためのものだと思います。Makefile は、' ' を省略し、' 'を単純な空白に置き換えるように修正する必要があります。\t-e\t

inline標準 C99での ' ' の動作は興味深いものです。

6.7.4 関数指定子

構文

関数指定子:

    inline

制約

関数指定子は、関数の識別子の宣言でのみ使用されます。

外部リンケージを持つ関数のインライン定義には、静的ストレージ期間を持つ変更可能なオブジェクトの定義が含まれてはならず、内部リンケージを持つ識別子への参照が含まれてはなりません。

ホスト環境では、インライン関数指定子は main の宣言に現れてはなりません。

セマンティクス

インライン関数指定子で宣言された関数はインライン関数です。関数指定子は複数回出現する場合があります。動作は、一度だけ表示された場合と同じです。関数をインライン関数にすることは、関数の呼び出しが可能な限り高速であることを示唆しています。118)そのような提案が有効である範囲は、実装によって定義されます。119)

内部リンケージを持つ関数はすべてインライン関数にすることができます。外部リンケージを持つ関数の場合、次の制限が適用されます。関数がインライン関数指定子で宣言されている場合、同じ翻訳単位でも定義される必要があります。翻訳単位内の関数のすべてのファイル スコープ宣言に extern なしのインライン関数指定子が含まれている場合、その翻訳単位内の定義はインライン定義です。インライン定義は関数の外部定義を提供せず、別の翻訳単位での外部定義を禁止しません。インライン定義は、翻訳者が同じ翻訳単位内の関数への呼び出しを実装するために使用できる外部定義の代替手段を提供します。120)

118)たとえば、「インライン置換」など、通常の関数呼び出しメカニズムの代替手段を使用する。インライン置換はテキスト置換ではなく、新しい関数も作成しません。したがって、たとえば、関数の本体内で使用されるマクロの展開では、関数が呼び出される場所ではなく、関数の本体が表示される時点での定義が使用されます。識別子は、本文が発生するスコープ内の宣言を参照します。同様に、関数は、外部定義に加えて発生するインライン定義の数に関係なく、1 つのアドレスを持ちます。

119)たとえば、実装はインライン置換をまったく実行しないか、インライン宣言のスコープ内の呼び出しに対してインライン置換のみを実行する可能性があります。

120)インライン定義は、対応する外部定義および他の翻訳単位の他の対応するインライン定義とは異なるため、静的ストレージ期間を持つすべての対応するオブジェクトも、それぞれの定義で異なります。

于 2009-12-08T12:43:59.823 に答える
0

Jonathan Leffler が freedup 1.5.3 の答えを提供しています: ハッシュ関数に「静的」を追加するか、「インライン」を削除してください。(おそらくその答えを受け入れる必要があります。)

freedup 1.6-* は Cygwin ではまったくコンパイルされません:

socket.c:20:26: fatal error: net/ethernet.h: No such file or directory

このファイルは Cygwin には存在しません。

于 2011-10-27T14:59:10.480 に答える