Mac使用homebrew安装OpenCV并运行Yolo-cpp-opencv笔记

1.安装homebrew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2.安装OpenCV

brew install opencv

安装目录为 /usr/local/Cellar/opencv

使用OpenCV遇到的坑

#include<opencv2/opencv.hpp>

会报错:

1.fatal error: ‘opencv2/opencv.hpp’ file not found

进入/usr/local/include目录,发现并没有opencv2目录,opencv实际上的目录为/usr/local/include/opencv4/opencv2,因此可以在目录/usr/local/inlcude中创建一个软连接指向opencv2

ln -s /usr/local/include/opencv4/opencv2 opencv2
注:ln命令
  • ln(英文全拼:link files)命令:它的功能是为某一个文件在另外一个位置建立一个同步的链接。

2.error “OpenCV 4.x+ requires enabled C++11 support”

原本直接编译会报错:
gcc yolo_main.cpp -o yolo_main
需要添加参数 -std=c++11:
gcc -std=c++11 yolo_main.cpp -o yolo_main

3.error: use of undeclared identifier ‘strcpy_s’; did you mean ‘strcpy’? strcpy_s(this->netname, config.netname.c_str());

  • **strcpy()与strcpy_s()的区别:**后者是前者的安全版本。
  • strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。

4.Undefined symbols for architecture x86_64

  • 创建opencv.pc
# Package Information for pkg-config
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/x86_64-linux-gnu
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.8
Libs: -L${libdir} ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_calib3d.so -lopencv_calib3d ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_contrib.so -lopencv_contrib ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_core.so -lopencv_core ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_features2d.so -lopencv_features2d ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_flann.so -lopencv_flann ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_gpu.so -lopencv_gpu ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_highgui.so -lopencv_highgui ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_imgproc.so -lopencv_imgproc ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_legacy.so -lopencv_legacy ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_ml.so -lopencv_ml ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_objdetect.so -lopencv_objdetect ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_ocl.so -lopencv_ocl ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_photo.so -lopencv_photo ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_stitching.so -lopencv_stitching ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_superres.so -lopencv_superres ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_ts.so -lopencv_ts ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_video.so -lopencv_video ${exec_prefix}/lib/x86_64-linux-gnu/libopencv_videostab.so -lopencv_videostab
Cflags: -I${includedir_old} -I${includedir_new}

《pkg-config 详解》参考链接:https://blog.csdn.net/newchenxf/article/details/51750239

5.linux下C 和 C++ include搜索的路径

C语言中#include <> 与 #include ""的区别
  • #include <>: 直接到系统指定目录查找头文件;
  • #include “”: 先到当前目录查找头文件,然后到系统指定目录查找头文件;
C++中#include <> 与 #include ""的区别
  • #include <>: 一般用户头文件;
  • #include “”: 自己头文件;

补充:gcc编译时查找头文件,按照以下路径顺序查找:

  • 1)gcc -I选项指定的头文件搜索路径。[可以指定多个路径依次查找]
gcc -I /usr/local/include/node a.c  
  • 2)环境变量C_INCLUDE_PATHCPLUS_INCLUDE_PATH中指定的路径;

  • 3)系统默认的路径,分别是 /usr/include/usr/local/include/usr/lib/gcc-lib/i386-linux/2.95.2/include(这个gcc库文件的路径,不同系统不一致)。

  • 4)相对路径。例如包含/usr/local/include/node/v8.h,则使用 #include<node/v8.h>

  • 参考链接:https://blog.csdn.net/a13602955218/article/details/101625857【未完待续…】

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113940485