为什么在使用make编译opencv代码时会出现错误,即使存在特定的丢失文件



我得到了以下makefile:

OBJS:=  main.o
CV_LIBS:= -I/usr/local/include/opencv4 -I/usr/local/include  -L/usr/local/lib/ -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
main: $(OBJS) 
g++ $(OBJS) $(CV_LIBS) -O3 -ffast-math -o main -Wall -g
main.o: main.h
g++ -c main.cpp -Wall -g

我的main.h文件有以下行:

#include <opencv4/opencv2/objdetect.hpp>

我得到以下错误:

/usr/local/include/opencv4/opencv2/objdetect.hpp:47:10: fatal error: opencv2/core.hpp: No such file or directory
47 | #include "opencv2/core.hpp"

我也尝试过以下几种,但没有运气:

#include <opencv2/objdetect.hpp>

错误:

main.h:4:10: fatal error: opencv2/objdetect.hpp: No such file or directory

我可以确认两者都有objdetect.hpp

  • /usr/local/include/opencv4/opencv2/
  • /usr/local/include/opencv4/opencv2/objdetect.hpp

我已经看过这个问题,但很遗憾我没有使用cmake。我做错了什么?非常感谢。

如果您查看生成打印的编译行(您的问题中没有包括(,那么您会非常清楚地看到为什么会出现此错误。

main.c编译为main.o的编译行如下所示:

g++ -c main.cpp -Wall -g

您可以清楚地看到,这里没有引用需要包含头文件的目录。

你的makefile有这个:

CV_LIBS:= -I/usr/local/include/opencv4 -I/usr/local/include  -L/usr/local/lib/ -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann

其中,您将编译器标志(如-I(与链接器标记(如同一变量中的-L-l(组合在一起,将它们全部调用";LIBS";,并且仅将它们添加到链接线。

您需要将编译器标志放入compile命令中,并将链接器标志放入link命令中:

CPPFLAGS = -I/usr/local/include/opencv4 -I/usr/local/include
CV_LIBS = -L/usr/local/lib/ -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
main: $(OBJS) 
g++ $(OBJS) $(CV_LIBS) -O3 -ffast-math -o main -Wall -g
main.o: main.h
g++ $(CPPFLAGS) -c main.cpp -Wall -g

仅供参考,在源代码中使用#include <opencv2/objdetect.hpp>而不是#include <opencv4/opencv2/objdetect.hpp>更正确