我正在使用 Learning OpenCV 学习 OpenCV书。
我在编译代码时遇到的一个问题是我必须编写一个很长的命令来编译并获取可执行文件。
这是我正在使用的命令
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 完成相同的任务。
最佳答案
您可以创建一个名为 Makefile
的文件在你的工作目录中是这样的:
CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o $@ $<
然后您可以将此文件用于所有单文件程序。只需调用 make
使用要编译的文件的基本名称。对于 facedetect.cpp
那会是
make facedetect
这里有更多细节:
makefile的一般格式是这样的:
target : dependecy1 dependenc2 ...
command that generates the target
因此对于您的示例,您可以这样写:
facedetect : facedetect.cpp
g++ $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp
对于每个新示例,您现在都可以创建一个新目标。但您也可以使其更通用:
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o $@ $<
在这里%
匹配任何非空子串。自动变量 $@
和 $<
替换目标文件和源文件的名称。
更多信息您可以咨询make documentation .
关于opencv - 在 Ubuntu/Linux 上用 C++ 编译 OpenCV 代码的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870297/