1

私はかなり簡単なメイクファイルを使用しています。.cc ファイルのリストを使用して OBJS を定義しました。依存関係とインクルード フラグを設定し、それらすべてを $CXXFLAGS に追加しました。次のようになります。

SRCS = file1.cc file2.cc file3.cc
OBJS = $(SRCS:.cc=.o)
CXXFLAGS=some flags
CXXFLAGS+=some include dirs
$(mylib.so): $OBJS
    $CXX -shared -o $@ $^

mylib.so は CXXFLAGS を (暗黙的に) 使用し、すべて正常にビルドされます。

最近、mylib.so に加えて、mylib_1.so と mylib_2.so が必要になりました。各 .so はすべて同じ .cc ファイルに依存しますが、コンパイラ フラグはすべて異なります (インクルード ディレクトリを含む)。

ターゲット .so に基づいてコンパイラ フラグを設定できるようにするにはどうすればよいですか? 私が抱えている問題は、CXXFLAGS を複数回設定すると上書きされることです。if/else の状況が必要なようです。

$CXXFLAGS1、$CXXFLAGS2、$CXXFLAGS3の3つの異なるフラグを設定し、それらを行で使用するようなことを試しました

$(mylib1.so): $OBJS
    $CXX $(CXXFLAGS1) -shared -o $@ $^

しかし、それは機能しません。

自分がやろうとしていることをどのように達成できますか? 3 つの個別の makefile を使用する方が良いですか? 私はそれを機能させる方法を見つけました。$OBJS の使用をやめて、ソース ファイルごとに明示的にフラグを指定することもできますが、これはサイズのスケーリングという点では恐ろしい考えのように思えます。

4

3 に答える 3

3

あなたの例の CXXFLAGS1 は、実際のC++ソースのコンパイルではなく、.soファイルの作成段階でのみ使用されます(これはあなたがやろうとしていることだと思います)。

上記を実現するには、3 つの異なるターゲットに対して Makefile 自体を 3 回呼び出し、MAKEFLAGS の一部またはコマンド ラインで CXXFLAGS (異なる値) を渡すことを検討してください。

更新:これは例です

すべて: build-lib1 build-lib2 build-lib3

ビルド-lib1:
    $(MAKE) $(MAKEFLAGS) CXXFLAGS="$(CXXFLAGS1)" lib1.so

ビルド lib2:
    $(MAKE) $(MAKEFLAGS) CXXFLAGS="$(CXXFLAGS2)" lib2.so

ビルド-lib3:
    $(MAKE) $(MAKEFLAGS) CXXFLAGS="$(CXXFLAGS3)" lib3.so

$(lib1.so): $OBJS
    $(CXX) -共有 -o $@ $^

等...

于 2012-11-29T00:17:29.860 に答える
2

私はこれを再帰呼び出しで行います。2 つのメイクファイルを使用します。

Makefile

すべて: mylib1.so mylib2.so

SRCS := file1.cc file2.cc file3.cc

mylib1.so: $(SRCS)
    テスト -d mylib1 || mkdir mylib1
    $(MAKE) -f ../lib.mak -C mylib1 TARGET=mylib1.so CXXFLAGS=-DMYLIB=1
    cp mylib1/mylib1.so mylib1.so

mylib2.so: $(SRCS)
    テスト -d mylib2 || mkdir mylib2
    $(MAKE) -f ../lib.mak -C mylib2 TARGET=mylib2.so CXXFLAGS=-DMYLIB=2
    cp mylib2/mylib2.so mylib2.so

の同じlib.makディレクトリ:

VPATH = ..

SRCS := file1.cc file2.cc file3.cc
OBJS := $(SRCS:.cc=.o)

$(ターゲット): $(OBJS)
    $(CXX) -共有 -o $@ $^

2 番目の makefile は実際にライブラリをビルドしますが、1 セットのCXXFLAGS. プライマリ メイクファイルは、各バージョンの最初のメイクファイルをCXXFLAGS別のディレクトリで呼び出します。を使用VPATHすると、同じディレクトリにないソース ファイルを簡単にコンパイルできます。

このセットアップをドライランでテストしました。

テスト -d mylib1 || mkdir mylib1
make -f ../lib.mak -C mylib1 TARGET=mylib1.so CXXFLAGS=-DMYLIB=1
make[1]: ディレクトリ `/home/depp/Maketest2/mylib1' に入ります
g++ -DMYLIB=1 -c -o file1.o ../file1.cc
g++ -DMYLIB=1 -c -o file2.o ../file2.cc
g++ -DMYLIB=1 -c -o file3.o ../file3.cc
g++ -shared -o mylib1.so file1.o file2.o file3.o
make[1]: ディレクトリ `/home/depp/Maketest2/mylib1' を離れます
cp mylib1/mylib1.so mylib1.so
テスト -d mylib2 || mkdir mylib2
make -f ../lib.mak -C mylib2 TARGET=mylib2.so CXXFLAGS=-DMYLIB=2
make[1]: ディレクトリ `/home/depp/Maketest2/mylib2' に入ります
g++ -DMYLIB=2 -c -o file1.o ../file1.cc
g++ -DMYLIB=2 -c -o file2.o ../file2.cc
g++ -DMYLIB=2 -c -o file3.o ../file3.cc
g++ -shared -o mylib2.so file1.o file2.o file3.o
make[1]: ディレクトリ `/home/depp/Maketest2/mylib2' を離れます
cp mylib2/mylib2.so mylib2.so
于 2012-11-29T00:21:19.243 に答える
2

Makefile には、ターゲット固有の変数値を含めることができます。何かのようなもの:

$(mylib1.so): CXXFLAGS += -lib1flags
$(mylib2.so): CXXFLAGS += -lib2flags
$(mylib3.so): CXXFLAGS += -lib3flags

ドキュメントによると、フラグは前提条件のターゲットに伝達されます。

ターゲット固有の変数には、もう 1 つの特別な機能があります。ターゲット固有の変数を定義すると、その変数の値は、このターゲットのすべての前提条件、およびそれらのすべての前提条件などに対しても有効になります (これらの前提条件がその変数を独自の変数でオーバーライドしない限り)。独自のターゲット固有の変数値)。たとえば、次のようなステートメントです。

 prog : CFLAGS = -g
 prog : prog.o foo.o bar.o

prog のレシピで CFLAGS を「-g」に設定しますが、prog.o、foo.o、bar.o を作成するレシピ、およびそれらの前提条件を作成するレシピでも CFLAGS を「-g」に設定します。 .

于 2012-11-29T00:11:33.440 に答える