目录

vscode工具链

安装必要软件

clang clangd clang-tidy clang-format lldb
cmake ninja-build

vscode插件

clangd CodeLLDB

若有头文件找不到等clangd相关的补全提示问题,可通过安装最新版clangd解决 https://clangd.llvm.org/installation.html

cmake项目管理

cmake+ninja+lldb

https://github.com/bing-dong/dot_vscode

注意事项

使用clangd自动补全时,需要compile_command.json文件

  1. 使用cmake管理的工程只需要在CMakeLists.txt中添加set(CMAKE_EXPORT_COMPILE_COMMANDS 1)即可

  2. 而使用make管理的工程需要通过compiledb来手动生成

pip install compiledb
# 在项目根目录下,生成JSON文件,但不编译项目
compiledb -n make

cmake语法

示例一

# 宏定义
add_compile_definitions(WITH_OPENSSL)

# generating compile_command.json used by clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)

# 项目下的头文件添加
include_directories(./include)
include_directories(./include/ffmpeg)

# 自动查找源文件
aux_source_directory(./src DIR_SRCS)

# 找系统库(头文件 和 链接库)
find_package(OpenSSL REQUIRED)

if( OpenSSL_FOUND )
  # 找到后将头文件目录包含
  include_directories(${OPENSSL_INCLUDE_DIRS})
  message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
else()
  message(FATAL_ERROR "Can not find OpenSSL")
endif()

# 生成二进制可运行文件
add_executable(onvif main.cpp ${DIR_SRCS})

# 寻找项目目录下的链接库
find_library(FFMPEG_LIBRARY avcodec avdevice avformat avutil swresample swscale HINTS ${PROJECT_SOURCE_DIR}/lib/ffmpeg)

# 添加链接库
target_link_libraries(onvif ${OPENSSL_LIBRARIES} ${FFMPEG_LIBRARY})

示例二

cmake_minimum_required(VERSION 3.0.0)
project(onvif VERSION 0.1.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
#set(CMAKE_CXX_FLAGS "-Wall -g")

# generating compile_command.json used by clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)

# define preprocessor macro
add_compile_definitions(WITH_OPENSSL WITH_DOM)

# for onvif auth
find_package(OpenSSL REQUIRED)
if( OpenSSL_FOUND )
  include_directories(${OPENSSL_INCLUDE_DIRS})
  message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
else()
  message(FATAL_ERROR "Can not find OpenSSL")
endif()

find_package(OpenCV REQUIRED)
if( OpenCV_FOUND )
  include_directories(${OpenCV_INCLUDE_DIRS})
  message(STATUS "Using OpenCV ${OPENCV_VERSION}")
else()
  message(FATAL_ERROR "Can not find OpenCV")
endif()

# header & source
include_directories(./include)
include_directories(./include/ffmpeg)
aux_source_directory(./src DIR_SRCS)

# aux_source_directory(./src/custom DIR_SRCS_CUSTOM)
# add_executable(onvif main.cpp ${DIR_SRCS} ${DIR_SRCS_CUSTOM})
# include_directories(${PROJECT_SOURCE_DIR}/include/custom)

# exe
add_executable(onvif main.cpp ${DIR_SRCS})

# lib
find_library(FFMPEG_LIBRARY avcodec avdevice avformat avutil swresample swscale HINTS ${PROJECT_SOURCE_DIR}/lib/ffmpeg)
target_link_libraries(onvif ${OPENSSL_LIBRARIES} ${OpenCV_LIBRARIES} ${FFMPEG_LIBRARY})