2

以下は、私のプロジェクトのディレクトリ構造です。

                       expt-main
                       ---------
                       Makefile_main
                    /             \
         subdir-1                    subdir-2
         --------                    --------
         Makefile_1                  Makefile_2
         mod_codeA.f90               mod_code1.f90
         mod_codeB.f90               mod_code2.f90
         mod_codeC.f90               mod_code3.f90

Makefile_main:

export

SHELL = /bin/sh

F90     = mpxlf95

SRCDIRS = $(subdir-1) $(subdir-2)

all:
        @for DIR in ${SRCDIRS} ;

          do \
            back=`pwd`; \
            cd $$DIR ;\
            $(MAKE) ; status=$$? ; \
            if [ $$status != 0 ] ; then \
              echo "Exit status fro make was $$status" ; exit $$status ; \
            fi ; \
            cd $$back ; \
         done

-------------------------------------------------------------------------------

Makefile-1:

%.o: %.f90
        $(F90) $(F90FLAGS) -I$(subdir-2) -c $<

mod_codeA.o: mod_codeC.o $(subdir-2)/mod_code2.o

-------------------------------------------------------------------------------

Makefile-2:

PROG = $(exec)

subdir-1_objs = $(subdir-1)/mod_codeA.o mod_codeB.o mod_codeC.o

all: $(PROG)

$(PROG): $(subdir-2_objs) $(subdir-1_objs) -o $@ $(subdir-2_objs) $(subdir-1_objs)

---------------------------------------------------------------------------------

-

最初に subdir-1 のコード (モジュール) をコンパイルし、次に subdir-2 のコード (モジュール) をコンパイルし、最後に実行可能ファイルを作成するように Makefile_main を作成しました。問題: subdir-1 のモジュールは subdir-2 のモジュールを使用し、同様に、subdir-2 のモジュールは subdir-1 のモジュールを使用します。使用中のモジュールが別のディレクトリにあるため、make が失敗します。この問題に対処するメイクファイルの書き方、つまり、サブディレクトリ 1 でモジュールをコンパイルしているときに、サブディレクトリ 2 からのオブジェクト ファイルが必要になるたびに、サブディレクトリ 2 に切り替えて必要なモジュールをコンパイルし、リターンする必要があります。さらなるアクションのためにサブディレクトリ-1に戻りますか?

4

2 に答える 2

2

あなたが言うように、異なるサブディレクトリ内のモジュールが互いに必要な場合、これは再帰的な Make の適切な使用法ではありません。

Makefile-1と を廃止しMakefile-2Makefile_mainすべての作業を行います。( を変更する方法を具体的に説明することはできませんMakefile-main。私は Fortran をやっておらず、 も理解していませんMakefile-2。また、サブディレクトリ 2 のモジュールとサブディレクトリ 1 のモジュールとの依存関係も見当たりません)。

于 2012-10-15T13:27:29.167 に答える
1

このディレクトリ レイアウトに固執し、3 つの個別の Makefile を保持したい場合は、コンパイラ フラグを使用して、モジュール ファイルを任意の共通ディレクトリに配置するよう FORTRAN コンパイラに指示できます。

たとえば、次を使用します。

$ gfortran --version
GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

-Iおよび-Jフラグを使用して、コンパイラに次のように指示できます。

  1. モジュール ファイル (.mod) を検索する場所
  2. 生成されたモジュール ファイルを配置する場所

そうは言っても、ベータ版が Makefiles に参加するよう提案したことは非常に理にかなっていると思います。なぜそうするべきなのかを知るには、この論文を読んでください。

最後に、この段階ではあなたのプロジェクトはそれほど大きくないように思われるので、ビルド システムとしてCMakeを考慮することをお勧めします。これは、ターゲット間の依存関係 (および他の多くのもの) を指定するためのより便利な方法を提供する可能性があるためです。

于 2012-10-16T10:48:01.260 に答える