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

标签 opencv compilation makefile cmake

我正在使用 Learning OpenCV 学习 OpenCV书。

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

这是我正在使用的命令

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

我不是 Make 专家,但我认为我可以使用 ma​​ke 来避免编写那么长的命令。 在此之前,我应该解释一下我的工作流程。我在主目录 (~/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/

相关文章:

c++ - g++/clang++ 中带有 makefile 的参数顺序

python - 如何使用cv2.resize(v4.2.0)

python - 带有 OpenCV/python 的 Prosilica GigE 相机

JavaFX 图像 getUrl() 在 Excelsior jet 中导致 NoSuchMethodError

makefile - 是否可以过滤静态模式规则中的先决条件?

ubuntu - ld联动问题:/usr/bin/ld: cannot find [libraryname]

c - 什么是 OpenCV FindChessboardCorners 约定?

python - 如何使用 PyQt 和 OpenCV 读取帧

使用命令提示符编译 C 源文件

linux - autoconf/configure 在哪里寻找包含文件