2

ソースコードファイルが異なるディレクトリにあると、Makefileの作成に行き詰まります。

ディレクトリ構造は次のとおりです。

ソースファイル(.cc)がフォルダーFOLDER1とFOLDER2にあり、ヘッダーファイルがINCLUDEという名前のフォルダーにあります。私のmakefileはFOLDER1にあります。

       program_NAME := myprogram
       program_C_SRCS := $(wildcard *.cc)
       program_C_OBJS := ${program_C_SRCS:.cc=.o}
       program_OBJS := $(program_C_OBJS) 
       program_INCLUDE_DIRS := ../INCLUDE
       program_LIBRARY_DIRS := 
       program_LIBRARIES :=
       CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
       LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
       LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

       .PHONY: all clean distclean

       all: $(program_NAME)

       $(program_NAME): $(program_OBJS)
       $(LINK.cc) $(program_OBJS) -o $(program_NAME)

       clean:
           @- $(RM) $(program_NAME)
           @- $(RM) $(program_OBJS)

       distclean: clean

ここで、すべてのソース(.cc)ファイルをFOLDER1に保持すると機能しますが、一部のファイルをFOLDER2に移動すると、未定義の参照のエラーが発生します。

すべてのヘッダーファイルをINCLUDEなどの1つのディレクトリに保持し、ソースファイルをさまざまなディレクトリに分散できるようにmakefileを変更する方法を理解するのを手伝ってください。

ありがとう !!!

4

1 に答える 1

2

問題はそれです

program_C_SRCS := $(wildcard *.cc)

同じディレクトリにのみソースファイルを追加します。したがって、リンクするときは、2番目のフォルダーのオブジェクトファイルがありません。他のフォルダのソースファイルをprogram_C_SRCSに追加するだけで、おそらく問題を解決できます。

program_C_SRCS += $(wildcard ../FOLDER2/*.cc)

ディレクトリを含める

gcc / g ++を使用していると思います。この場合、 http: //gcc.gnu.org/onlinedocs/cpp/Search-Path.htmlによると、ヘッダーパスは左から右に検索されます。つまり、最初に指定されたパスは次のとおりです。最初に検索しました。したがって、-IINCLUDE1オプションの前に-IINCLUDE2を追加するだけで、必要なものを実現できます。開始するmakefileには、複数のインクルードパスビルドインのための変換がすでに含まれています。

   CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))

したがって、インクルードパスを書き直すだけで済みます。

program_INCLUDE_DIRS := ../INCLUDE2
program_INCLUDE_DIRS += ../INCLUDE1
于 2012-04-14T11:17:53.450 に答える