Makefile在Ubuntu/Linux上用C++编译OpenCV代码

SPV*_*SPV 18 opencv makefile compilation cmake

我正在使用Learning OpenCV学习OpenCV.

编译代码时我遇到的一个问题是我必须编写一个很长的命令来编译并获取可执行文件.

这是我正在使用的命令

g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv`
Run Code Online (Sandbox Code Playgroud)

我没有制作专家,但我想我可以消除写使用很长的命令作出.在此之前,我应该解释我的工作流程.我在我的主目录(~/opencv/)中创建了一个名为opencv的目录.我正逐节阅读本书,并将示例或练习编码到该目录中的新cpp源代码文件中.所以我不知道手头的文件名.

现在我想要做的是,

假设我编写了一个facedetect.cpp在我的opencv目录中命名的新文件,如果我调用make就像这样

make facedetect
Run Code Online (Sandbox Code Playgroud)

然后我想让make为我执行以下命令

g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`
Run Code Online (Sandbox Code Playgroud)

所以每当我创建一个名为abc.cpp的新文件时,我都会执行make abc 以便我可以运行

$ ./abc
Run Code Online (Sandbox Code Playgroud)

在我的命令行测试我的abc.cpp

请给出make文件,这样我就可以省去每次输入那个长命令的挫败感.

PS:我用Google搜索的帮助就这个问题和发现这种使用CMake的,但我不明白是什么一样.还请解释如何使用CMake执行相同的任务.

sie*_*hie 24

你可以创建一个Makefile在你工作目录中调用的文件,如下所示:

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

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

那么您可以将此文件用于所有单文件程序.只需make使用要编译的文件的基名调用即可.对于facedetect.cpp这将是

make facedetect
Run Code Online (Sandbox Code Playgroud)

这里有一些更多细节:

makefile的一般格式如下:

target : dependecy1 dependenc2 ...
    command that generates the target
Run Code Online (Sandbox Code Playgroud)

所以对于你的例子你可以写:

facedetect : facedetect.cpp
    g++  $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp
Run Code Online (Sandbox Code Playgroud)

对于每个新示例,您现在可以创建新目标.但你也可以使它更通用:

% : %.cpp
    g++  $(CFLAGS) $(LIBS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

这里%匹配任何非空子串.自动变量$@$<替换目标文件和源文件的名称.有关更多信息,请参阅make文档.

  • 看起来只有'g ++ $(CFLAGS)-o $ @ $ <$(LIBS)`才能正常工作.但我认为这是一个开放的事情.感谢Makefile.你能解释一下这意味着什么,或者给予任何好的资源来学习Make (8认同)
  • 感谢Siva Prasad Varma,这确实是争论的**顺序**.`$(LIBS)`**必须在编译命令结束时**,否则OpenCV示例本身将无法编译! (3认同)

Ser*_*ano 5

GNU Make非常聪明,你需要的Makefile不需要像目前为止给出的其他答案一样冗长.这是一个简单的Makefile,您可以使用它来编译OpenCV示例:

CPPFLAGS = $(shell pkg-config --cflags opencv)
LDLIBS = $(shell pkg-config --libs opencv)
Run Code Online (Sandbox Code Playgroud)

而已.由于Make的隐式规则,Makefile可以很简单.

然后make像往常一样运行:

make facedetect
Run Code Online (Sandbox Code Playgroud)

这假定存在一个facedetect.cfacedetect.cpp在同一目录中.

如果您想学习以下内容,我推荐以下(免费!)一书:http://oreilly.com/catalog/make3/book/index.csp