Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv Makefile以C++;在Ubuntu/Linux上_Opencv_Compilation_Makefile_Cmake - Fatal编程技术网

Opencv Makefile以C++;在Ubuntu/Linux上

Opencv Makefile以C++;在Ubuntu/Linux上,opencv,compilation,makefile,cmake,Opencv,Compilation,Makefile,Cmake,我正在用这本书学习OpenCV 我在编译代码时面临的一个问题是,我必须编写一个长命令来编译和获取可执行文件 这是我正在使用的命令 g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv` 我不是Make专家,但我认为我可以不用使用Make编写那么长的命令。 在此之前,我应该解释我的工作流程。我在我的主目录中创建了一个名为opencv的目录(~/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:我在谷歌上搜索了这方面的帮助,并找到了使用CMake的方法,但我不明白这是怎么回事。还请解释如何使用CMake完成相同的任务。

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

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

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

(要回答您的问题-请注意,
CMake
make
非常不同-现在您应该只使用
make

您可以在您的工作目录中创建一个名为
Makefile
的文件,如下所示:

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

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<
target : dependecy1 dependenc2 ...
    command that generates the target
以下是更多细节:

生成文件的一般格式如下所示:

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

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<
target : dependecy1 dependenc2 ...
    command that generates the target
因此,对于您的示例,您可以写:

facedetect : facedetect.cpp
    g++  $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp
现在,您可以为每个新示例创建一个新目标。但你也可以让它更一般化:

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

此处
%
匹配任何非空子字符串。gnumake的自动变量
$@
$非常智能,您需要的Makefile不需要像目前给出的其他答案那样冗长。下面是一个简单的Makefile,您可以使用它编译OpenCV示例:

CPPFLAGS = $(shell pkg-config --cflags opencv)
LDLIBS = $(shell pkg-config --libs opencv)
就这样。由于Make的存在,Makefile可以这么短

然后像往常一样运行
make

make facedetect
这假设在同一目录中存在
facedetect.c
facedetect.cpp


如果你想学习Make,我推荐以下(免费!)书:

看起来只有
g++$(CFLAGS)-o$@$<$(LIBS)
可以使用。但我认为这是一个opencv的东西。谢谢你的Makefile。你能解释一下这意味着什么,或者提供一些好的资源来学习MakeGood吗。这并不像看上去那么可怕和难以理解。感谢湿婆·普拉萨德·瓦尔马,这确实是争论的顺序<代码>$(LIBS)
必须在编译命令的末尾执行,否则OpenCV示例本身将无法编译!您只需使用
LDLIBS=`pkg config--libs opencv`
即可,无需显式编写build命令。stackoverflow.com/questions/33530363/order-in-makefile也可用于订单。今天,您只需安装cmake(如果尚未安装=>sudo-apt-get-install-cmake);打开终端;导航到opencv文件夹;克马克。;制作注意cmake后面的“.”(点),现在,等待所有内容都被删除built@ComputerSaysNo当前位置我想你误解了这个问题。他不是在试图编译OpenCV,而是他自己根据一本书中的练习(使用OpenCV库)编写的源文件