2

この OpenCV 2 Cookbookのチュートリアル コードをいじっています。コードには Makefile が付属していないので、コードベース内のすべてのファイルを Make できる Makefile を作成したいと考えています。私の計画は、プロファイリングを使用してすべてのファイルをコンパイルし、すべての実行可能ファイルを実行して gprof の結果を収集するスクリプトを作成することです。次に、さまざまな OpenCV 関数の計算時間についてある程度の直感を得ることができます。

コードベースは次のように構成されています。tutorial_code/Chapter[1-10]/*.cpp.cppファイルは自己完結型であり、このコードベース内の他のモジュールとリンクせずにコンパイルできます。(ただし、ヘッダーのみの小さなライブラリがいくつかあります。)

ここに私が立ち往生しているいくつかのことがあります:

  • 通常、$(EXEC)Makefile の は、多くの構築作業の集大成であるファイルを表します。ただし、私の場合は、ファイル$(EXEC)ごとに個別に作成したいと考えてい.cppます。私はこれを正しく行うことに近づいていると思いますが、これまでのところ、私の Makefile は生成されますが生成され*.oません*.out
  • SOURCES = $(wildcard *.cpp)これは、現在のディレクトリにある一連の cpp ファイルを「収集」する方法であることを理解しています。サブディレクトリ内のすべてのファイルSOURCES = $(wildcard */*.cpp)を掘り下げて取得することは理にかなっています。.cppしかし、うまくいかないようです。

このチュートリアルから始めて、提案された機能を実装する Makefile をセットアップしました。それはうまくいきません...ディレクトリにドリルダウンして$(wildcard */*.cpp)いないようです.$<$@basefilename.obasefilename.out

CC = g++
CC_FLAGS = -w `pkg-config opencv --cflags`
LINK = g++
LINKOPTS = -pg `pkg-config opencv --libs`

SOURCES = $(wildcard */*.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
EXEC = $(SOURCES:.cpp=.out)

%.out: %.o
    $(LINK) $< $(LINKOPTS) -o $@

%.o: %.cpp
    $(CC) -c $(CC_FLAGS) $< -o $@

clean:
    rm -f $(EXEC) $(OBJECTS)

  • 私は Makefile と OpenCV にかなり精通しており、Makefile で依存関係やオブジェクトなどのリストを手作業でコーディングして自分のプロジェクトをコンパイルする際に問題はありませんでした。ただし、当面の問題としては、ユーザーの介入をあまり必要とせずにすべてを自動的に作成できれば素晴らしいと思います。
  • 私がコンパイルしようとしているコードベースのコピーについては、遠慮なくコメント、電子メール、またはメッセージを送ってください。
  • また、ディレクトリを反復処理し、tutorial_code/Chapter[1-10]ディレクトリごとに 1 つの Makefile を作成するスクリプトを作成することも考えました。次に、スクリプト内に別の関数を作成して、各ディレクトリで一度 Make を呼び出します。ただし、1 つの壮大な Makefile を実行するというアイデアは、より楽しいように思えます。

編集:これSOURCES = $(wildcard *.cpp)、ファイルが配置されている同じディレクトリに Makefileを使用して配置すると機能しcppます。$(wildcard */*.cpp)ただし、サブディレクトリにドリルダウンする方法をまだ見つけようとしています。

編集 2: 上記の Makefile が正しく機能するようになりました。以前のバージョンを表示するには、編集履歴を自由にスクロールしてください。

4

1 に答える 1

3

関数wildcardのみを使用して、任意の深さまで再帰的に動作する のバージョンを作成できます。make

find-recursive = \
  $(wildcard $1/$2) \
  $(foreach f,$(wildcard $1/*/.),\
    $(call find-recursive,$(patsubst %/.,%,$f),$2))

SOURCES = $(call find-recursive,.,*.cpp)
于 2012-11-29T20:13:54.313 に答える