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}