4

.so(ダイナミックライブラリ)ファイルにリンクするC++プロジェクトに取り組んでいます。a.soにリンクする必要のあるターゲットPROGがあり、a.soも次のMakefileで指定されている私によってビルドされていると仮定します。

PROG_SRCS = prog.cpp
PROG_OBJS = $(PROG_SRCS: %.cpp:%.o)

all: PROG
PROG: $(PROG_OBJS) liba.so
    $(LINK.cpp) -o $@ $(PROG_OBJS) -la

LIBA_SRCS = liba/a.cpp
LIBA_OBJS = $(LIBA_SRCS: %.cpp:%.o)

liba.so: $(LIBA_OBJS)
    $(LINK.cpp) -shared -Wl.-soname,$@ -o $@ $^

自動依存関係の生成を使用して、.cppファイルが.hファイルへの独自の依存関係を取得しました。そしてprog.cppにはahが含まれています

しかし、このように、a.cppを変更すると、liba.soはremakeになり、PROGはremake(relink)になりますが、これは私が望んでいることではありません。liba.soの実装を変更するだけですが、インターフェイス定義は変更しません。PROGは、ああ変更した後にリメイクする必要があります

PROGをビルドする前にa.soをビルドするようにしたいのですが、a.soを変更してもPROGのビルドは発生しません。

次のMakefileは私が理解した方法ですが、わずかな副作用があります(一時ファイルを生成します)。

ORDER = /tmp/.ORDER

all: PROG
PROG: $(PROG_OBJS) $(ORDER)
    $(LINK.cpp) -shared -Wl,-soname,$@ -o $@ $(PROG_OBJS) -la

$(ORDER): liba.so
    test -e $@ || touch $@

このようにして、liba.soがリメイクを取得するたびに、$(ORDER)もリメイクを取得します。ただし、ファイルが存在しない場合にのみファイルにアクセスします。

一時ファイルを作成するなど、副作用なしにこの種の依存関係を指定する方法はありますか?

4

1 に答える 1

3

GNU makeの移植性のない側面に依存する場合は、注文のみの前提条件を使用できます。これには注文のみの前提条件があります。これは、すでに発見したスタンプファイル方式以外の唯一の方法です。

于 2012-05-05T06:50:08.220 に答える