Make 找不到我的 opencv.hpp 文件 - 如何引导它?
Make can't find my opencv.hpp file - how to direct it?
我的 raspberry pi 零有一个双摄像头硬件模块。它需要一些软件才能开始工作。我已经从这里克隆了 the required repo,如下所示:
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ ls
arducam_multi_adapter_uc444.cpp Makefile obj readme.md shell
当我尝试制作时,出现以下错误:
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ sudo make
g++ -c -o obj/arducam_multi_adapter_uc444.o arducam_multi_adapter_uc444.cpp `pkg-config --cflags --libs opencv`
arducam_multi_adapter_uc444.cpp:4:10: fatal error: opencv2/opencv.hpp: No such file or directory
4 | #include <opencv2/opencv.hpp>
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:10: obj/arducam_multi_adapter_uc444.o] Error 1
正在查看 /usr/include/opencv4/opencv2
我看到了这个脚本想要的文件。
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ ls /usr/include/opencv4/opencv2
alphamat.hpp ccalib dnn_superres.hpp freetype.hpp imgcodecs line_descriptor.hpp opencv_modules.hpp quality shape superres video ximgproc
aruco ccalib.hpp dpm.hpp fuzzy imgcodecs.hpp mcc optflow quality.hpp shape.hpp superres.hpp video.hpp ximgproc.hpp
aruco.hpp core face fuzzy.hpp img_hash mcc.hpp optflow.hpp rapid.hpp stereo surface_matching videoio xobjdetect.hpp
bgsegm.hpp core_detect.hpp face.hpp hdf img_hash.hpp ml phase_unwrapping reg stereo.hpp surface_matching.hpp videoio.hpp xphoto
bioinspired core.hpp features2d hdf.hpp imgproc ml.hpp phase_unwrapping.hpp rgbd stitching text videostab xphoto.hpp
bioinspired.hpp datasets features2d.hpp hfs.hpp imgproc.hpp objdetect photo rgbd.hpp stitching.hpp text.hpp videostab.hpp
calib3d dnn flann highgui intensity_transform.hpp objdetect.hpp photo.hpp saliency structured_light tracking viz
calib3d.hpp dnn.hpp flann.hpp highgui.hpp line_descriptor opencv.hpp plot.hpp saliency.hpp structured_light.hpp tracking.hpp viz.hpp
我尝试按照 this earlier question 中的描述创建 opencv.pc,但仍然找不到 opencv.hpp。
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ cat /usr/local/lib/pkgconfig/opencv.pc
prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: opencv
Description: The opencv library
Version: 2.x.x
Cflags: -I${includedir}/opencv -I${includedir}/opencv2
Libs: -L${libdir} -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -lopencv_core -lopencv_ml -lopencv_features2d -lopencv_objdetect -lopencv_flann -lopencv_video -lopencv_highgui
我觉得 opencv.pc 没有指向正确的位置,因为它解析为 /usr/include/opencv2
并且在我的 pi 上,我有 /usr/include/opencv4/opencv2
中的文件,尽管进行了修补opencv.pc 文件指向的位置,我仍然 运行 进入上述错误。我已经将它恢复到原来的状态,并按照他们的建议修改了我的 .bashrc
。
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ pkg-config --cflags --libs opencv
-I/usr/include/opencv -I/usr/include/opencv2 -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -lopencv_core -lopencv_ml -lopencv_features2d -lopencv_objdetect -lopencv_flann -lopencv_video -lopencv_highgui
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ echo $PKG_CONFIG_PATH
:/usr/local/lib/pkgconfig
我觉得需要链接或指向某个地方才能让 make 看到那个 opencv.hpp
文件。如果我进去并手动编辑 arducam_multi_adapter_uc444.cpp
的第 4 行到 opencv.hpp
的绝对路径,我不再在 arducam_multi_adapter_uc444.cpp
中收到错误,但在 opencv.hpp
中然后包含并开始在 /usr/include/opencv4/opencv2
中寻找 core.hpp
和其他 .hpp
。我该如何解决这个问题,我感觉很接近,我只是不知道如何告诉 make 去哪里看。
这与 make 本身无关。问题是您的编译器调用对于您拥有的 include 语句是错误的。
您可以自己调试:首先,查看调用的命令:
g++ -c -o obj/arducam_multi_adapter_uc444.o arducam_multi_adapter_uc444.cpp `pkg-config --cflags --libs opencv`
现在 运行 从 shell 提示符中命令自己。你会看到它以同样的方式失败。所以你知道不是 make,而是编译器命令错了。
接下来,弄清楚 pkg-config
扩展到什么; 运行 来自您的 shell 提示:
pkg-config --cflags --libs opencv
它将打印出它添加的选项。这些选项是错误的,导致你的编译失败。
首先,您要将源文件编译成 object 文件,因此不需要 --libs
选项。 --libs
选项为 link 提供库,编译期间不使用这些库。
其次,您的配置是这样的:
Cflags: -I${includedir}/opencv -I${includedir}/opencv2
这意味着编译器将看到像 -I.../include/opencv -I.../include/opencv2
这样的选项。查找 header 文件的方式没有任何魔力:编译器采用 -I
提供的路径,并从 #include
行追加它需要的路径,一个接一个,直到header 被发现。就这些了。
由于您包含 opencv2/opencv.hpp
,它会将该路径添加到每个 -I
路径。因此,编译器首先查找 .../include/opencv/opencv2/opencv.hpp
,然后查找 .../include/opencv/opencv2/opencv2/opencv.hpp
.
显然,您想要的 header 在这两个路径中都不可用:您想要的 header (大概)是 .../include/opencv2/opencv.hpp
.
因此,如果您希望 #include
指定 opencv2/opencv.hpp
,您的 cflags 需要是:
Cflags: -I${includedir}
我的 raspberry pi 零有一个双摄像头硬件模块。它需要一些软件才能开始工作。我已经从这里克隆了 the required repo,如下所示:
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ ls
arducam_multi_adapter_uc444.cpp Makefile obj readme.md shell
当我尝试制作时,出现以下错误:
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ sudo make
g++ -c -o obj/arducam_multi_adapter_uc444.o arducam_multi_adapter_uc444.cpp `pkg-config --cflags --libs opencv`
arducam_multi_adapter_uc444.cpp:4:10: fatal error: opencv2/opencv.hpp: No such file or directory
4 | #include <opencv2/opencv.hpp>
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:10: obj/arducam_multi_adapter_uc444.o] Error 1
正在查看 /usr/include/opencv4/opencv2
我看到了这个脚本想要的文件。
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ ls /usr/include/opencv4/opencv2
alphamat.hpp ccalib dnn_superres.hpp freetype.hpp imgcodecs line_descriptor.hpp opencv_modules.hpp quality shape superres video ximgproc
aruco ccalib.hpp dpm.hpp fuzzy imgcodecs.hpp mcc optflow quality.hpp shape.hpp superres.hpp video.hpp ximgproc.hpp
aruco.hpp core face fuzzy.hpp img_hash mcc.hpp optflow.hpp rapid.hpp stereo surface_matching videoio xobjdetect.hpp
bgsegm.hpp core_detect.hpp face.hpp hdf img_hash.hpp ml phase_unwrapping reg stereo.hpp surface_matching.hpp videoio.hpp xphoto
bioinspired core.hpp features2d hdf.hpp imgproc ml.hpp phase_unwrapping.hpp rgbd stitching text videostab xphoto.hpp
bioinspired.hpp datasets features2d.hpp hfs.hpp imgproc.hpp objdetect photo rgbd.hpp stitching.hpp text.hpp videostab.hpp
calib3d dnn flann highgui intensity_transform.hpp objdetect.hpp photo.hpp saliency structured_light tracking viz
calib3d.hpp dnn.hpp flann.hpp highgui.hpp line_descriptor opencv.hpp plot.hpp saliency.hpp structured_light.hpp tracking.hpp viz.hpp
我尝试按照 this earlier question 中的描述创建 opencv.pc,但仍然找不到 opencv.hpp。
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ cat /usr/local/lib/pkgconfig/opencv.pc
prefix=/usr
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: opencv
Description: The opencv library
Version: 2.x.x
Cflags: -I${includedir}/opencv -I${includedir}/opencv2
Libs: -L${libdir} -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -lopencv_core -lopencv_ml -lopencv_features2d -lopencv_objdetect -lopencv_flann -lopencv_video -lopencv_highgui
我觉得 opencv.pc 没有指向正确的位置,因为它解析为 /usr/include/opencv2
并且在我的 pi 上,我有 /usr/include/opencv4/opencv2
中的文件,尽管进行了修补opencv.pc 文件指向的位置,我仍然 运行 进入上述错误。我已经将它恢复到原来的状态,并按照他们的建议修改了我的 .bashrc
。
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ pkg-config --cflags --libs opencv
-I/usr/include/opencv -I/usr/include/opencv2 -lopencv_calib3d -lopencv_imgproc -lopencv_contrib -lopencv_legacy -lopencv_core -lopencv_ml -lopencv_features2d -lopencv_objdetect -lopencv_flann -lopencv_video -lopencv_highgui
pi@luna:~/RaspberryPi/Multi_Camera_Adapter/Multi_Adapter_Board_2Channel_uc444 $ echo $PKG_CONFIG_PATH
:/usr/local/lib/pkgconfig
我觉得需要链接或指向某个地方才能让 make 看到那个 opencv.hpp
文件。如果我进去并手动编辑 arducam_multi_adapter_uc444.cpp
的第 4 行到 opencv.hpp
的绝对路径,我不再在 arducam_multi_adapter_uc444.cpp
中收到错误,但在 opencv.hpp
中然后包含并开始在 /usr/include/opencv4/opencv2
中寻找 core.hpp
和其他 .hpp
。我该如何解决这个问题,我感觉很接近,我只是不知道如何告诉 make 去哪里看。
这与 make 本身无关。问题是您的编译器调用对于您拥有的 include 语句是错误的。
您可以自己调试:首先,查看调用的命令:
g++ -c -o obj/arducam_multi_adapter_uc444.o arducam_multi_adapter_uc444.cpp `pkg-config --cflags --libs opencv`
现在 运行 从 shell 提示符中命令自己。你会看到它以同样的方式失败。所以你知道不是 make,而是编译器命令错了。
接下来,弄清楚 pkg-config
扩展到什么; 运行 来自您的 shell 提示:
pkg-config --cflags --libs opencv
它将打印出它添加的选项。这些选项是错误的,导致你的编译失败。
首先,您要将源文件编译成 object 文件,因此不需要 --libs
选项。 --libs
选项为 link 提供库,编译期间不使用这些库。
其次,您的配置是这样的:
Cflags: -I${includedir}/opencv -I${includedir}/opencv2
这意味着编译器将看到像 -I.../include/opencv -I.../include/opencv2
这样的选项。查找 header 文件的方式没有任何魔力:编译器采用 -I
提供的路径,并从 #include
行追加它需要的路径,一个接一个,直到header 被发现。就这些了。
由于您包含 opencv2/opencv.hpp
,它会将该路径添加到每个 -I
路径。因此,编译器首先查找 .../include/opencv/opencv2/opencv.hpp
,然后查找 .../include/opencv/opencv2/opencv2/opencv.hpp
.
显然,您想要的 header 在这两个路径中都不可用:您想要的 header (大概)是 .../include/opencv2/opencv.hpp
.
因此,如果您希望 #include
指定 opencv2/opencv.hpp
,您的 cflags 需要是:
Cflags: -I${includedir}