Opencv Makefile以C++;在Ubuntu/Linux上
我正在用这本书学习OpenCV 我在编译代码时面临的一个问题是,我必须编写一个长命令来编译和获取可执行文件 这是我正在使用的命令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/)。我正在一节一节地阅
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库)编写的源文件