0

というディレクトリがありprojectます。

と という名前の 2 つのサブディレクトリとclientserverという名前のメイクファイルが含まれていMakefileます。

clientとはそれぞれとserverという名前のソース ファイルを持っています。client.cserver.c

そのディレクトリに属する​​ソースのサブディレクトリに個別のメイクファイルはありません。すべてのビルドは単一の makefile によって行われます。Makefileコードは

FLAGS = -W -Wall -g -pthread

SERV =./server/server.c      #My server code 
CLI =./client/client.c       #My client code

build:svr cnt

svr: $(SERV) 
    cc $(FLAGS) $(SERV) -o ./server/server.out
cnt: $(CLI)
    cc $(FLAGS) $(CLI) -o ./client/client.out

今私は走っmake cntて、それは答えた

cc -W -Wall -g -pthread ./client/client.c -o ./client/client.out

make cnt問題は、変更していないにもかかわらず、後続のすべてのコマンドが再度コンパイルされ、上記のテキストが出力されることです。./client/client.c

私はここで立ち往生しています。何をすべきかわからない。

私がやりたいことは次のとおりです。

  • を使用して、その実行可能ファイルをmake cntコンパイルしてディレクトリに出力しますclient/client.cclient/
  • を使用して、その実行可能ファイルをmake svrコンパイルしてディレクトリに出力します。server/server.cserver/
  • そしてmake, compile bothserver/server.c andclient/client.c` を使用して、実行可能ファイルをそれぞれのディレクトリに出力します

しかし、私は実行可能ファイルを呼び出していないので、私がsvr抱えている問題は解決されていません。

./client/client.out代わりにターゲットを変更してからcnt呼び出すと、必要なものは問題ありませんが、端末make client/client.outに長いコマンドを入力したくありませんmake client/client.out

私が得た回避策は次のとおりです

cnt: $(CLI)
         cc $(FLAGS) $(CLI) -o cnt
         cp cnt ./client/client.out

しかし、それだけでは満足できません。私がやりたいことは本当にシンプルで、それを回避する便利な方法があるはずです。では、どうすればそれを行うことができますか?

4

2 に答える 2

2

なりたいものを形にしましょう。`cnt' という名前のターゲットを再構築しないでください。作成した makefile は client.out ファイルについて何も認識していません。これは、ルール内のシェル コマンドにしか表示されないためです。Makeプログラムはシェルコマンドから情報を読み取らず、そこで置換を行って実行するだけです。

makefile が再構築するターゲットを選択するとき (`cnt' はこれらのターゲットの 1 つです)、ターゲットファイルの更新時間とその前提条件の更新時間を比較します。「make cnt」を実行した時点ではcnt という名前のファイルが存在しないため、その名前のターゲットは更新が必要であると見なされます。そのため、コマンドが実行され、 cnt という名前のファイルが生成されないため、次の make run も更新の対象と見なされます。

考えられる解決策は 2 つあります。1 つ目は、ルール コマンドが生成するファイルと同じ名前をターゲットに与えることです。したがって、次のようになる可能性があります。

client/client.out: $(CLI)
    cc $(FLAGS) $(CLI) -o ./client/client.out

ちなみに、あなたの質問はディレクトリとは何の関係もありません。.PHONY ディレクティブについても読んで、 cc の代わりに $(CC) を使用し、gnu make manualを読んでください。これは非常に役立つ場合があります。

于 2009-08-23T18:44:47.303 に答える
0

これを試して:

SERVO =./server/server.out
CLIO =./client/client.out

.PHONY: srv cnt ビルド
ビルド: svr cnt
svr: $(サーボ)
cnt: $(CLIO)

$(SERVO) $(CLIO): %.out : %.c
    cc $(フラグ) $^ -o $@

これで、 make srvmake cnt、または単にmakeを実行できます。
もう少し洗練されたことができますが、今のところはこれで十分です。

于 2009-08-24T16:36:39.957 に答える