0

私は Linux GNU C プロジェクトを持っています。このプロジェクトでは、共通の C ソース コード ベースを使用しますが、メイクファイルは異なります。現在、同じフォルダーに 2 つの makefile があり、各デバイスに 1 つずつあります。コードを変更するときは、まず「make clean」を実行して最初のモデルを作成し、次に「make clean」を実行して 2 番目のモデルを作成する必要があります。 . これは、異なるコンパイラとプロセッサを使用しているためです。コード ファイルが変更されていなくても、別のデバイス用に再コンパイルする必要があります。

私がやりたいことは、2 番目のモデルに別のフォルダーを使用して、*.d ファイルと *.o ファイルの別のコピーを保存することです。「クリーンにする」必要はなく、変更されたソースを再コンパイルするだけです。私はメイクファイルの構文を調べましたが、Linux を初めて使用するので、このような不可解な性質に頭を悩ませることしかできません。

私が検討している 1 つの方法は、.c & .h ファイルを model_1 フォルダーから model_2 フォルダーに更新することです。新しい *.c および *.h ファイルのみをあるフォルダーから別のフォルダーにコピーする簡単なメイクファイルを提供してもらえますか?

または、ソース ファイルを複製する必要がないように、共通のソース フォルダーと個別の出力フォルダーを用意する方法が必要です。それを達成するための助けをいただければ幸いです。確認したい場合は、メイクファイルを提供できます。

4

3 に答える 3

0

ソースファイルをコンパイルして、異なるディレクトリ内のオブジェクトファイルにすることができます(「フォルダ」は、Unixでは実際には適切な単語ではありません)。make適切なルールを設定するだけです。そして、あなたはomake 、、 ..sconsのような他のビルダーを使うかもしれません

remakeを使用してGNU-sをデバッグできますMakefile。あなたは次のようなルールの中に持つことができます

$(OBJDIR)/%.o: $(SRCDIR)/%.c
         $(COMPILE.c) -c $^ -o $@

そして、あなたは例えばで(あなたのの前半でMakefile)変数を設定することができます

OBJDIR:=obj-$(shell uname -m)

または何かより良い

GNUmakeのマニュアルを読むことをお勧めします; makefileの概要があります。

于 2012-10-11T17:42:18.850 に答える
0

生成されたファイル(オブジェクトと依存関係)を、コンパイル時にビルドタイプごとに個別のフォルダーに配置する必要があります。これがあなたのために働くかもしれない私がしたことです:

$(PRODUCT1_OBJDIR)/%.o $(PRODUCT1_OBJDIR)/%.d: %.cpp
        @mkdir -p $(@D)
        $(CXX) $(PRODUCT1_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT1_OBJDIR)/$*.o

$(PRODUCT2_OBJDIR)/%.o $(PRODUCT2_OBJDIR)/%.d: %.cpp
        @mkdir -p $(@D)
        $(CXX) $(PRODUCT2_DEPSFLAGS) $(CXXFLAGS) $(INCLUDE_DIR) $< -o $(PRODUCT2_OBJDIR)/$*.o

$PRODUCT1_OBJDIRおよび$PRODUCT2_OBJDIRは、生成されたファイルを保存するディレクトリの変数名です。これにより、依存関係の変更がチェックされ、必要に応じて再コンパイルされます。

それでも問題が解決しない場合は、フィードバックをお返しし、解決を試みます。

于 2012-10-12T01:03:54.243 に答える
0

これは、makeppのリポジトリ メカニズムを使用して簡単に実現できます。を呼び出すと、現在のディレクトリmakepp -R../src ARCH=whateverの下のすべての部分がシンボリックにリンクさ../srcれ、ここでコンパイルされます。

ファイル.makepprcを作成して、このアーキテクチャに固有のオプションを入れることもできるので、どのコマンドをどこで呼び出すべきか混乱することはありません。

異なるアーキテクチャが同じように生成されたファイル (生成されたソースなど) を持っている場合、ビルドすることもでき../src、他のアーキテクチャは現在のコンパイル オプションに依存しないすべてのものを取得します。

makeppには他にもたくさんあります。GNU make でできることのほとんどすべてを実行する以外に、もっと便利なことがたくさんあります。また、Perl プログラミングを使用して makefile を拡張することもできます。

于 2013-04-07T11:15:30.913 に答える