【问题标题】:Makefile to Compile OpenCV Code in C++ on Ubuntu/LinuxMakefile 在 Ubuntu/Linux 上用 C++ 编译 OpenCV 代码
【发布时间】:2012-04-09 20:22:03
【问题描述】:

我正在使用Learning OpenCV book 学习 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:我已经在 Google 上寻求帮助,并在使用 CMake 时找到了 this,但我不明白它的作用。还请解释我如何使用 CMake 来完成相同的任务。

【问题讨论】:

    标签: opencv compilation makefile cmake


    【解决方案1】:

    您可以在工作目录中创建一个名为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 $@ $<
    

    这里% 匹配任何非空子字符串。自动变量$@$&lt; 替换目标文件和源文件的名称。 更多信息可以咨询make documentation

    【讨论】:

    • 看起来只有g++ $(CFLAGS) -o $@ $&lt; $(LIBS) 可以工作。但我认为这是opencv的事情。感谢您的 Makefile。你能解释一下这是什么意思或提供任何好的资源来了解 Make
    • 关于 make 的好资源:make manual。它并不像看起来那么可怕和难以理解。
    • 感谢 Siva Prasad Varma,这确实是参数的顺序$(LIBS) 必须在编译命令结束时走,否则OpenCV示例本身将无法编译!
    • 你可以直接使用LDLIBS = `pkg-config --libs opencv`,而不需要显式编写构建命令。
    • stackoverflow.com/questions/33530363/order-in-makefile 也是关于订单的。
    【解决方案2】:

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

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

    就是这样。感谢 Make 的implicit rules,Makefile 可以这么短。

    然后像往常一样运行make

    make facedetect
    

    这假设在同一目录中有facedetect.cfacedetect.cpp

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

    【讨论】:

    • 今天,您可以简单地安装 cmake(如果尚未安装 => sudo apt-get install cmake);打开终端;导航到 opencv 文件夹;制作 .;制作;注意 cmake 之后的“.”(点),现在,等待一切都被构建
    • @ComputerSaysNo:我认为你误解了这个问题。他不是在尝试编译 OpenCV,而是在自己从书中的练习中编写的源文件(使用 OpenCV 库)。
    • 啊,对,误会了,对不起
    【解决方案3】:

    在您的工作目录中创建一个名为 makefile 的文件,其中包含以下内容:

    CFLAGS = $SHELL(pkg-config --cflags opencv)
    LIBS = $SHELL(pkg-config --libs opencv)
    
    facedetect : facedetect.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<
    

    然后,当您要编译时,只需键入:

    $ make
    

    (回答你的PS - 请注意CMakemake 非常不同 - 现在你应该只使用make。)

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多