2017-12-10 7 views
0

現在、ヘッダファイルを作成しているので、makefileとともにDebianでGCCを使用しようとしています。私はメイクファイルを "作る" しようとするたびに、次のように、私はエラーを取得する:GCCとMakefile(1つでも関数を複数宣言したもの)

setup.o:機能で 'セットアップ':

setup.c :(テキスト+ 0x0の):複数の定義をfinalkek.c :(テキスト+ 0x0の)::。 `セットアップ」

finalkek.oの*** [projExec]エラー:LD

メイク1つの終了ステータスが返されました:最初のcollect2はは

ここで定義されました1

私のメイクファイルは次のようになります。

projExec: finalkek.o setup.o 
    gcc -o projExec finalkek.o setup.o 

finalkek.o: finalkek.c setup.h 
    gcc -c finalkek.c 

setup.o: setup.c 
    gcc -c setup.c 

finalkek.cは私のメインのファイルであり、そしてsetupは私のヘッダーです。ここに私のメインのファイルで

が、私はそれを言及唯一の時間です:

void setup() 
{ 

     rest of code here... 

} 
+2

は、なぜあなたは 'セットアップの実装' setup.h'で() '関数を持っているのですか? 'setup.c'には何が入っていますか? (それはいくつかのタイプミスですか?)。あなたの問題はおそらく複数のインポートエラーです。適切な編集を行うと、明確な回答が得られます。 – KyrSt

+4

問題には関係しませんが、 'void main()'は 'int main(void)'でなければなりません。'void main()'を使用するよう指示した本やチュートリアルをお持ちの方は、著者がCを知っている方が良い方を探してください。 –

+0

また、タイトルとタグの両方から "Debian"を編集しました。さらに、ポストの中にすべてのコード(メイクファイルを含む)を投稿してください。スクリーンショットではありません。 – KyrSt

答えて

0

私が気づいたいくつかのこと:私のヘッダファイル、setup.h

include "setup.h" // Using the double quotes for a custom header... 

void main() 
{ 

setup(); 

     rest of code here... 

} 

、私はこのようにそれを持っています:技術的には許可されていますが、関数全体をヘッダファイルに実装するのは誤りです。ヘッダーファイルはプロトタイプ用です(void setup(void) { ... }ではなくvoid setup(void);)。あなたのsetup.cには何が入っていますか?また、Makeはこれのように動作するはずがありません。

finalkek.o: finalkek.c setup.h 
    gcc -c finalkek.c 

それで実際の実装、ちょうどプロトタイプを持つことになっていないとあなたは、直接ヘッダファイルをコンパイルしてはいけません。これはプリプロセッサの処理であり、指示文#includeで、指定されたヘッダの内容全体を取り込み、Cファイルの中に置くだけです。ですから、setup.hをコンパイルするようMakeに指示すると、そのファイルの内容がプロジェクトに2回含まれているため、おそらくエラーになります。

他の人のコメントと同じように、setup()の実際のコードをsetup.cに移動するのが適切です。 setup.hは次のようになります。

#ifndef SETUP_H 
#define SETUP_H 

void setup(void); 

#endif 

ライン#ifndef SETUP_H, #define SETUP_H、そして#endifは、複数回同じファイルを含めてからあなたを保つヘッダファイルのためのフォーマットツールです。

そして添付setup.c:

#include "setup.h" 

void setup(void) { 
    // your code here 
} 

finalkek.c:

int main(void) { 
    setup(); 

    // rest of code here 
} 
関連する問題