如何在Mac环境下搭建VSCode + CMake开发环境

VSCode中CMake文件的使用

一、示例模板

在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 . -B build
# -S 表示 source 文件路径,即CMakeLists.txt 文件所在位置,示例中在当前目录
# -B 表示 binary 文件路径,示例中放入 build 目录下

cmake --build build
# --build 编译源代码成为可执行二进制文件,编译所需资源在 build 目录中

几个注意点:

  • 在引入了 gflags 库后:1)编译执行时,总是报如下的错误。根据描述感觉是引入库时发生了冲突,导致同时引入了两个 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 执行也一切正常。

    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 文件,用来定义对工程项目操作的各种任务,便于在图形化界面中调用。

{
	"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)清理 四个任务。
  • 如果要对代码进行断点调试,注意需要在配置阶段增加参数-DCMAKE_BUILD_TYPE=Debug,在构建阶段加上参数--config debug
    (注意不要写错了,作者在测试中就将CMAKE写成了CNAKE,执行一切正常不会报错,但断点调试一直不行,最后发现是编译时设置DEBUG模式没成功导致的)。
  • 另外一个容易犯错的地方 ${fileBasenameNoExtension} 不要吧Basename写成BaseName了,是区分大小写的。

3. VSCode 中定义运行脚本

定义好多个任务后,可以在VSCode中将这些任务串联起来形成批处理脚本。创建 ./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 程序对生成的二进制文件进行调试。
  • 注意使用 preLaunchTask 定义了需要提前执行 tasks.json 中定义的构建任务,完成二进制文件的生成,再使用 gdb 来分析调试。
  • 注意系统默认使用的是 x86_64 架构来分析二进制文件,作者机器是苹果的MAC,所以要修改成 arm64 的架构,使得 gdb 能够正常工作。

二、问题记录

1. 找不到opencv开发库

作者运行环境为Mac系统,开发中 vscode 里找不到引入的 opencv 的头文件。记录解决过程如下

  • 执行 brew list --versions opencv确认本机是否安装过 opencv 库,及其版本信息。也可以通过包管理工具pkg-config来获取相关信息pkg-config --modversion opencv4
  • 如果发现没有安装,则执行 brew install opencv安装opencv开发库。
  • 安装命令执行完成后,需要执行如下命令来确定软件安装的路径 brew --prefix opencv注意!! 这里非常重要,因为按照 Linux 系统的习惯,以及网上很多文章所给的示例,安装完成后的默认地址都认为是 /usr/local 目录下,但执行上述命令发现,本机的安装的默认路径是 /opt/homebrew/opt/opencv,所以导致即便成功安装后,在vscode里任然找不到 opencv 对应的头文件。
    • 为了让系统帮助 cmake 能找到 opencv 开发库,设置了如下环境变量

       export PKG_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
      }
      
  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值