web-dev-qa-db-ja.com

Ubuntu / Linux上のC ++でOpenCVコードをコンパイルするMakefile

Learning OpenCV bookを使用してOpenCVを学習しています。

コードのコンパイル中に直面する問題の1つは、実行可能ファイルをコンパイルして取得するための長いコマンドを作成する必要があることです。

これは私が使用しているコマンドです

g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv`

私はMakeエキスパートではありませんが、makeを使用してその長いコマンドを書く必要がなくなると思います。その前に、ワークフローを説明する必要があります。ホームディレクトリ(~/opencv/)にopencvというディレクトリを作成しました。私は本を​​セクションごとに読んでおり、そのディレクトリ内の新しいcppソースコードファイルにサンプルまたは演習をコーディングしています。 だから、手元にファイルの名前がわからない。

今、私がやりたいことは、

opencvディレクトリにfacedetect.cppという名前の新しいファイルをコーディングしたとします。makeをこのように呼び出すと

make facedetect

次に、makeに次のコマンドを実行させたい

g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`

abc.cppという名前の新しいファイルを作成するたびに、make abcを実行して実行できるようにします

$ ./abc

コマンドラインでabc.cppをテストする

毎回その長いコマンドを入力するフラストレーションを節約できるように、そのmakeファイルを提供してください。

PS:私はこれについて助けを求めてグーグルで調べました this を使用してCMakeを見つけましたが、それが何をするのか理解できませんでした。また、同じタスクにCMakeをどのように使用できるかも説明してください。

18
SPV

次のように、作業ディレクトリにMakefileというファイルを作成できます。

CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<

その後、このファイルをすべての単一ファイルプログラムに使用できます。コンパイルしたいファイルのベース名でmakeを呼び出すだけです。にとって facedetect.cppそれは

make facedetect

ここでいくつかの詳細:

メイクファイルの一般的な形式は次のとおりです。

target : dependecy1 dependenc2 ...
    command that generates the target

したがって、あなたの例では次のように書くことができます:

facedetect : facedetect.cpp
    g++  $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp

新しい例ごとに、新しいターゲットを作成できます。しかし、より一般的にすることもできます:

% : %.cpp
    g++  $(CFLAGS) $(LIBS) -o $@ $<

ここに %は、空でない部分文字列に一致します。自動変数$@および$<ターゲットファイルとソースファイルの名前を置き換えます。詳細については、 ドキュメント作成 を参照してください。

24
sietschie

GNU Makeは非常に賢く、これに必要なMakefileは、これまでに示した他の回答のように冗長である必要はありません。以下に、OpenCVの例をコンパイルするために使用できる簡単なMakefileを示します。

CPPFLAGS = $(Shell pkg-config --cflags opencv)
LDLIBS = $(Shell pkg-config --libs opencv)

それでおしまい。 Makeの 暗黙の規則 のおかげで、Makefileはこれほど短くなります。

その後、通常どおりmakeを実行します。

make facedetect

これは、facedetect.cまたはfacedetect.cpp同じディレクトリ内。

Makeを学びたい場合は、次の(無料!)本をお勧めします。 http://oreilly.com/catalog/make3/book/index.csp

5
Serrano

次を含む作業ディレクトリにmakefileという名前のファイルを作成します。

CFLAGS = $Shell(pkg-config --cflags opencv)
LIBS = $Shell(pkg-config --libs opencv)

facedetect : facedetect.cpp
    g++ $(CFLAGS) $(LIBS) -o $@ $<

次に、コンパイルしたいときは次のように入力します。

$ make

[〜#〜] ps [〜#〜]-CMakemakeとは非常に異なることに注意してください-今のところ、makeを使用してください。)

0
Paul R