1

私は初心者です。LinuxでCプログラムのmakefileを作成したいのですが。

私のプログラムフローは、 で宣言されている(ただし定義されていない)cmd.c呼び出しですcdirec(), dspecd(), sfile(), hfile()mainl.h

cdirec(), dspecd(), sfile() and hfile()cdirec.c, dspecd.c, sfile.cとでそれぞれ定義されてhfile.cいます。

cdirec()mimx(), skloc(), fnc() and fcmp()次に、で宣言されているsubl.h(ただし定義されていない)呼び出し

mimx(), skloc(), fnc() and fcmp()それぞれで定義されてmimx.c, skloc.c, fnc.c and fcmp.cいます。

次のようにmakefileを作成しようとしました。

all: cmd.o cdir.o dspecd.o sfile.o hfile.o
    cc cmd.o cdir.o dspecd.o sfile.o hfile.o -o sourceinfo
cmd.o: cmd.c mainl.h
    cc -c cmd.c
cdir.o: cdirec.o mimx.o skloc.o fnc.o fcmp.o
    cc cdirec.o mimx.o skloc.o fnc.o fcmp.o -o cdir.o
cdirec.o: cdirec.c mainl.h subl.h
    cc -c cdirec.c
dspecd.o: dspecd.c mainl.h
    cc -c dspecd.c
sfile.o: sfile.c mainl.h
    cc -c sfile.c
hfile.o: hfile.c mainl.h
    cc -c hfile.c
mimx.o: mimx.c subl.h
    cc -c mimx.c
skloc.o: skloc.c subl.h
    cc -c skloc.c
fnc.o: fnc.c subl.h
    cc -c fnc.c
fcmp.o: fcmp.c subl.h
    cc -c fcmp.c

何が問題なのかわかりません。しかし、でmainへの未定義の参照を取得しcdir.oます。cdirec.cは次のようになります。

#include<stdio.h>
#include "subl.h"

void cdirec()
{
printf("\nAll details of current directory is printed.\n");
mimx();
skloc();
fnc();
fcmp();
}

これは単なる関数宣言ファイルであるため、メインを含めることはできません。親切に案内してください。

答え:

all: cmd.o cdirec.o dspecd.o sfile.o hfile.o mimx.o skloc.o fnc.o fcmp.o 
    cc cmd.o cdirec.o dspecd.o sfile.o hfile.o mimx.o skloc.o fnc.o fcmp.o -o sourceinfo
cmd.o: cmd.c mainl.h
    cc -c cmd.c
cdirec.o: cdirec.c mainl.h subl.h
    cc -c cdirec.c
dspecd.o: dspecd.c mainl.h
    cc -c dspecd.c
sfile.o: sfile.c mainl.h
    cc -c sfile.c
hfile.o: hfile.c mainl.h
    cc -c hfile.c
mimx.o: mimx.c subl.h
    cc -c mimx.c
skloc.o: skloc.c subl.h
    cc -c skloc.c
fnc.o: fnc.c subl.h
    cc -c fnc.c
fcmp.o: fcmp.c subl.h
    cc -c fcmp.c
clean:
    rm -rf *.o sourceinfo
4

3 に答える 3

3

ここで問題が発生します:

cdir.o: cdirec.o mimx.o skloc.o fnc.o fcmp.o
    cc cdirec.o mimx.o skloc.o fnc.o fcmp.o -o cdir.o

これは、これらの指定されたファイルをという名前の実行可能ファイルccにリンクするように指示しています。実行可能ファイルには関数が必要です。しかし、実行可能ファイルをリンクしようとしていないようです。代わりに、複数のオブジェクトファイルを1つのオブジェクトファイルに収集しようとしています。.ocdir.omain

これを行う必要はありません。すべてのオブジェクトファイルを最終的な実行可能ファイルにリンクするだけです。1行でその数のファイルを処理するのが面倒な場合は、Make変数を定義できます。一般名はOBJS(「オブジェクト」の略)です。

OBJS  = cdirec.o 
OBJS += mimx.o 
OBJS += skloc.o 
OBJS += fnc.o 
OBJS += fcmp.o 
# ... etc

sourceinfo: ${OBJS}
    cc ${OBJS} -o sourceinfo

それらを単一のファイルに収集する場合は、ライブラリを構築し、それを最終的な実行可能ファイルにリンクできます。ライブラリはarコマンドで構築されます。拡張子が必要.aです:

cdir.a: cdirec.o mimx.o skloc.o fnc.o fcmp.o
    ar rcs cdir.a cdirec.o mimx.o skloc.o fnc.o fcmp.o

次に、最終的な実行可能ファイルを作成するときに、それをリンクします。

cc cmd.o dspecd.o sfile.o hfile.o cdir.a -o sourceinfo

組織の脇として、ソースファイルごとに1つの関数を定義しているように見えます。それはかなり面倒になります。通常、関連する機能を同じソースファイルにグループ化します。cdirec()、、、mimx() skloc()のすべてをfnc()同じfcmp()ファイルで定義して、単一のオブジェクトファイルを生成することも可能ですが、実際のコードを見ないと断言できません。

Makeには、Makefileをはるかに簡単にする機能もあります。.c特に、ファイルをにコンパイルするための暗黙のルールがすでに存在する.oため、これらすべてのルールは必要ありません。ヘッダーへの依存関係だけが必要です(暗黙的に生成されないため)。

cmd.o: mainl.h
cdirec.o: mainl.h subl.h
dspecd.o: mainl.h
sfile.o: mainl.h
hfile.o: mainl.h
mimx.o: subl.h
skloc.o: subl.h
fnc.o: subl.h
fcmp.o: subl.h

これらの依存関係を実際に自動的に生成することもできますが、それはもう少し複雑なので、ここでは説明しません。

于 2012-12-19T07:29:14.020 に答える
1

静的/動的ライブラリを作成しようとしていない場合は、どこかにmainが必要です。mainを使用してテストファイルを追加し、そのファイルを使用してコンパイルします。
また、これらすべての*.oを明示的に言及する必要はないと思います。Makeはそれを理解するのに十分賢いです。

于 2012-12-19T07:26:46.323 に答える
-1

依存関係の手書きを気にしないでください。使用autotoolsまたはライトバージョン- gcc -MM ./*

于 2012-12-19T07:11:45.483 に答える