发布时间:2025-06-24 19:55:51 作者:北方职教升学中心 阅读量:286
二、
brew install opencv
安装opencv开发库。-DCMAKE_BUILD_TYPE=Debug
,在构建阶段加上参数--config debug
(注意不要写错了,作者在测试中就将CMAKE写成了CNAKE,执行一切正常不会报错,但断点调试一直不行,最后发现是编译时设置DEBUG模式没成功导致的)。
- 执行
brew list --versions opencv
确认本机是否安装过 opencv 库,及其版本信息。
3. VSCode 中定义运行脚本
定义好多个任务后,可以在VSCode中将这些任务串联起来形成批处理脚本。
VSCode中CMake文件的使用
一、{"version":"2.0.0","tasks":[// 1. cmake 配置{"type":"cppbuild","label":"Step-1 : debug configure","command":"cmake","args":["-DCMAKE_BUILD_TYPE=Debug","-S .","-B build"],"problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"}},// 2. cmake 构建{"type":"cppbuild","label":"Step-2 : debug build","command":"cmake","args":["--build","build","--config","Debug"],"problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"},"dependsOn":["CMake: Configure"]},// 3. 运行可执行文件{"type":"shell","label":"Step-3 : running","command":"./build/demo_${fileBasenameNoExtension}","problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"},"dependsOn":["CMake: Build"]},// 4. cmake 清理{"type":"shell","label":"Step-4 : clean","command":"rm","args":["-rf","build"],"problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"}}]}
- 本示例中将执行过程分成了 1)配置,2)构建,3)运行,4)清理 四个任务。根据描述感觉是引入库时发生了冲突,导致同时引入了两个 gflags.cc 文件,但奇怪的是错误信息中的两个gflags.cc 文件都不存在;2)后来发现这个问题只是出现在使用vscode编译时,在terminal终端里手动编译时执行一切正常,因此初步判断是环境问题导致的;3)接下来,在MakeLists.txt文件中加入调试信息,打印 gflags 库的相关参数,发现vscode中引入 gflags 库的位置是 python 安装文件的目录
/usr/local/anaconda3/include
,这肯定有问题;4)解决方法是在 CMakeLists.txt 文件的头部加上对安装环境参数 CMAKE_PREFIX_PATH
的设置,让其指向作者本机 brew 安装开发库的默认路径 /opt/homebrew
,最后问题得以解决,在 vscode 执行也一切正常。示例模板
{"version":"2.0.0","tasks":[// 1. cmake 配置{"type":"cppbuild","label":"Step-1 : debug configure","command":"cmake","args":["-DCMAKE_BUILD_TYPE=Debug","-S .","-B build"],"problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"}},// 2. cmake 构建{"type":"cppbuild","label":"Step-2 : debug build","command":"cmake","args":["--build","build","--config","Debug"],"problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"},"dependsOn":["CMake: Configure"]},// 3. 运行可执行文件{"type":"shell","label":"Step-3 : running","command":"./build/demo_${fileBasenameNoExtension}","problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"},"dependsOn":["CMake: Build"]},// 4. cmake 清理{"type":"shell","label":"Step-4 : clean","command":"rm","args":["-rf","build"],"problemMatcher":"$msCompile","group":{"kind":"build","isDefault":true},"options":{"cwd":"${workspaceFolder}"}}]}
/usr/local/anaconda3/include
,这肯定有问题;4)解决方法是在 CMakeLists.txt 文件的头部加上对安装环境参数 CMAKE_PREFIX_PATH
的设置,让其指向作者本机 brew 安装开发库的默认路径 /opt/homebrew
,最后问题得以解决,在 vscode 执行也一切正常。示例模板在VSCode中创建CMake配置文件以及相关的运行任务
1. CMakeLists.txt 文件
该文件定义了cmake如何对整个工程项目进行编译的所有内容,该文件并不依赖于VSCode环境,是后续VSCode中的任务定义需要调用cmake的命令,所以先创建该文件
# 最低版本要求cmake_minimum_required(VERSION 3.10)# 项目信息project(opencv_demo)# 使用find_package命令查找OpenCV库set(CMAKE_PREFIX_PATH "/opt/homebrew" ${CMAKE_PREFIX_PATH})find_package(OpenCV REQUIRED)find_package(gflags REQUIRED)# 打印 opencv 库的相关信息if (OpenCV_FOUND) message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")else() message(FATAL_ERROR "Could not find OpenCV library")endif()# 打印 gflags 库的相关信息if (gflags_FOUND) message(STATUS "GFLAGS_FOUND: ${GFLAGS_FOUND}") message(STATUS "GFLAGS_INCLUDE_DIR: ${GFLAGS_INCLUDE_DIR}") message(STATUS "GFLAGS_INCLUDE_DIRS: ${GFLAGS_INCLUDE_DIRS}") message(STATUS "GFLAGS_LIBRARY: ${GFLAGS_LIBRARY}") message(STATUS "GFLAGS_LIBRARIES: ${GFLAGS_LIBRARIES}") message(STATUS "GFLAGS_VERSION: ${GFLAGS_VERSION}")else() message(FATAL_ERROR "Could not find gflags library")endif()# 为全局所有可执行程序添加头文件include_directories(${OpenCV_INCLUDE_DIRS} ${gflags_INCLUDE_DIRS})# 链接库link_libraries(${OpenCV_LIBS} ${gflags_LIBRARIES})# 添加可执行文件add_executable(demo_1.img src/1.img.cpp)add_executable(demo_2.video src/2.video.cpp)add_executable(demo_3.camera src/3.camera.cpp)# 单独为某一个程序添加头文件,上面统一处理了,这里注销# target_include_directories(demo_1.img PRIVATE ${OpenCV_INCLUDE_DIRS})# target_link_libraries(demo_1.img PRIVATE ${OpenCV_LIBS})
如果要直接在命令行中使用 CMakeLists.txt 文件,可以执行如下命令
# 进入工程项目目录,源代码放在 src 目录,生成文件放在 build 目录cmake -S.-Bbuild# -S 表示 source 文件路径,即CMakeLists.txt 文件所在位置,示例中在当前目录# -B 表示 binary 文件路径,示例中放入 build 目录下cmake --buildbuild# --build 编译源代码成为可执行二进制文件,编译所需资源在 build 目录中
几个注意点:
在引入了 gflags 库后:1)编译执行时,总是报如下的错误。问题记录
1. 找不到opencv开发库
作者运行环境为Mac系统,开发中 vscode 里找不到引入的 opencv 的头文件。创建 ./vscode/launch.json 文件
{"version":"0.2.0","configurations":[{"name":"(lldb) Launch","type":"cppdbg","request":"launch","program":"${workspaceFolder}/build/demo_${fileBasenameNoExtension}","args":[],"stopAtEntry":false,"cwd":"${workspaceFolder}","environment":[],"externalConsole":false,"MIMode":"lldb","preLaunchTask":"CMake: Build","setupCommands":[{"description":"Enable pretty-printing for gdb","text":"-enable-pretty-printing","ignoreFailures":true}],"targetArchitecture":"arm64",//"x86_64", "logging":{"engineLogging":true}}]}
- 该命令的作用是启动 gdb 程序对生成的二进制文件进行调试。
ERROR: flag ‘flagfile’ was defined more than once
(in files ‘/tmp/gflags-20230913-4677-1ht96q3/gflags-2.2.2/src/gflags.cc’ and ‘/Users/ktietz/demo/mc3/conda-bld/gflags_1628725066556/work/src/gflags.cc’).
2. 在 VSCode 中定义软件编译的各项任务
可以在工程项目目录下创建 .vscode/tasks.json 文件,用来定义对工程项目操作的各种任务,便于在图形化界面中调用。
为了让系统帮助 cmake 能找到 opencv 开发库,设置了如下环境变量
exportPKG_CONFIG_PATH=/opt/homebrew/opt/opencv/lib/pkgconfig:$PKG_CONFIG_PATH
为了让 vscode 找到开发库位置,创建了一个配置 cpp 属性的配置文件 ./vscode/c_cpp_properties.json,在 includePath 中增加了opencv 头文件的路径,示例如下:
{"configurations":[{"name":"Mac","includePath":["${workspaceFolder}/**","/opt/homebrew/opt/opencv/include/opencv4"],"defines":[],"macFrameworkPath":["/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"],"compilerPath":"/usr/bin/clang","cStandard":"c17","cppStandard":"c++17","intelliSenseMode":"macos-clang-arm64"}],"version":4}
- 该命令的作用是启动 gdb 程序对生成的二进制文件进行调试。
brew --prefix opencv
, 注意!! 这里非常重要,因为按照 Linux 系统的习惯,以及网上很多文章所给的示例,安装完成后的默认地址都认为是 /usr/local 目录下,但执行上述命令发现,本机的安装的默认路径是 /opt/homebrew/opt/opencv
,所以导致即便成功安装后,在vscode里任然找不到 opencv 对应的头文件。也可以通过包管理工具pkg-config来获取相关信息pkg-config --modversion opencv4
。