我得到了以下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>
更正确