主页

ffmpeg之音频格式

样本格式 基于ffmpeg-4.3.2 相关头文件 #include <libavutil/samplefmt.h> 相关定义 音频样本格式: enum AVSampleFormat { AV_SAMPLE_FMT_NONE = -1, AV_SAMPLE_FMT_U8, ///< unsigned 8 bits AV_SAMPLE_FMT_S16, ///< signed 16 bits AV_SAMPLE_FMT_S32, ///< signed 32 bits AV_SAMPLE_FMT_FLT, ///< float...

阅读更多

cmake之编译库

简介 下面一个基本库的编译安装为例 目录结构 编译前 math ├── CMakeLists.txt └── src ├── MathFunctions.cc └── MathFunctions.h 编译安装后 math ├── CMakeLists.txt ├── dist │ ├── include │ │ └── MathFunctions.h │ └── lib │ ├── libMathFunctions.a │ ├── libMathFunctions.dll │ └── libMathFunctions.dll.a └── src ├── MathFunc...

阅读更多

cmake之常用命令

概述 更多详细示例请点击cmake-demo查看 步骤 windows下需要手动设置编译器 mkdir build cd build cmake ../ make make install 基本项目 # CMake 最低版本号要求 cmake_minimum_required (VERSION 2.8) # 项目信息 project (Demo1) # 指定生成目标 add_executable(${PROJECT_NAME} main.cc) 查找目录下的所有源文件 # 查找目录下的所有源文件 # 并将名称保存到 DIR_SRCS 变量 aux_source_directory(. DIR_SRCS) # 多目录 aux_sou...

阅读更多

cmake之交叉编译

交叉编译 使用方法 cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake .. 编写cmake工具链文件 目前在Linux上交叉编译成功,在Windows上使用MinGW交叉编译失败 # 设置系统名 set(CMAKE_SYSTEM_NAME Linux) # 设置硬件平台(不是必需的) set(CMAKE_SYSTEM_PROCESSOR arm) set(MY_TOOL_DIR /opt/toolchain-arm_cortex-a7+neon_gcc-5.3.0_glibc-2.22_eabi) set(MY_CROSS arm-openwrt-linux-) set(CMAKE_C_COMPILER ${MY_T...

阅读更多

cmake之test命令

添加CTEST测试 需要先实现一个可以接受输入参数的可执行程序,用 add_executable 就可以,不用管这个可执行程序的存放目录,CMake 会帮你自动填上。 # 启用测试 enable_testing() # 测试 5 的平方 # add_test (test_5_2 Demo 5 2) # set_tests_properties (test_5_2 PROPERTIES PASS_REGULAR_EXPRESSION "is 25") # 定义一个宏,用来简化测试工作 macro (do_test arg1 arg2 result) add_test (test_${arg1}_${arg2} Demo ${arg1}${arg2}) s...

阅读更多

cmake之message命令

blog cmake之message函数 message :为用户显示一条消息 message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …) message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...) 消息类型 (无) = 重要消息 STATUS = 非重要消息 WARNING = CMake 警告, 会继续执行 AUTHOR_WARNING = CMake 警告 (dev), 会继续执行 SEND_ERR...

阅读更多

cmake之list命令

列表操作命令 总语法: list(LENGTH <list> <output variable>) list(GET <list> <element index> [<element index> ...] <output variable>) list(APPEND <list> <element> [<element> ...]) list(FIND <list> <value> <output variable>) list(INSERT <list> <element_index> <eleme...

阅读更多

cmake之install

make install打包安装 install用于指定在安装时运行的规则。它可以用来安装很多内容,可以包括目标二进制、动态库、静态库以及文件、目录、脚本等: install(TARGETS <target>... [...]) install({FILES | PROGRAMS} <file>... [...]) install(DIRECTORY <dir>... [...]) install(SCRIPT <file> [...]) install(CODE <code> [...]) install(EXPORT <export-name> [...]) 指定安装位置 CMAKE_INSTALL_...

阅读更多

cmake之find_package

基本调用模式 CMake的find_package指令用于查找并载入一个外部包的设置.详细了解请点击 find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [[COMPONENTS] [components...]] [OPTIONAL_COMPONENTS components...] [NO_POLICY_SCOPE]) 自定义module包 自定义config包 我们可以自定义一个module给别人使用,步骤如下: 生成静态库和动态库(同时) install库相关文件 in...

阅读更多

SDL2之播放音频

SDL2音频子系统相关API介绍 实验环境 QT 5.14.2(mingw730_64) SDL2.0.16 音频相关结构体 // 音频格式 typedef Uint16 SDL_AudioFormat; // audio flags #define SDL_AUDIO_MASK_BITSIZE (0xFF) #define SDL_AUDIO_MASK_DATATYPE (1<<8) #define SDL_AUDIO_MASK_ENDIAN (1<<12) #define SDL_AUDIO_MASK_SIGNED (1<<15) #define SDL_AUDIO_BIT...

阅读更多

GDB常用命令

1. 概述 转自链接 GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。一般来说,GDB主要帮助我们完成以下四个方面的功能: 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 在某个指定的地方或条件下暂停程序。 当程序被停住时,可以检查此时你的程序中所发生的事。 在程序执行过程中修改程序中的变量或条件,将一个b...

阅读更多

C++的boost库的下载编译

概述 来自维基百科 Boost C++ 库(Libraries)是一组扩展C++功能的经过同行评审(Peer-reviewed)且开放源码程序库。大多数的函数为了能够以开放源码或者封闭项目的方式运作,而许可于Boost软件许可协议(Boost Software License)之下。许多Boost的开发人员是来自C++标准委员会,而部分的Boost库成为C++的TR1标准之一。 为了要确保库的效率与弹性,Boost广泛的使用模板(template)功能。而它是针对各式领域的C++用户与应用领域(Application Domain)上,包含的库类别从像smart_ptr库这种类通用库,到像是文件系统的操作系统抽象层,甚至能够利用Boost来开发额外的库或是给高级的C++用户利用,像...

阅读更多

C++的asio库的下载编译

概述 Asio是一个跨平台的C++库,用于网络和低级I / O编程 为开发人员提供一致的异步模型,使用现代 C++方法。 当针对C ++ 11(或更高版本)时,大多数asio都可以在没有任何额外依赖项的情况下使用。独立版的asio是header-only,所以使用时只需包含头文件即可。把解压得到的include目录(包含asio.hpp)放到项目目录里。 相关链接 Asio官网 独立版使用说明 boost版使用说明 下载 下载地址1 我这里选择的是1_24_0版本,下载之后解压。 编译 编译环境 Windows gcc version 7.3.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 projec...

阅读更多

C++的关键字

C++关键字 类关键字 class 声明类 声明有作用域枚举类型(C++11 起) 在模板声明中,class 可用于引入类型模板形参与模板模板形参 若作用域中存在具有与某个类类型的名字相同的名字的函数或变量,则 class 可附于类名之前以消歧义,这产生一个详述类型说明符 struct 复合类型的声明 有作用域枚举类型的声明(C++11 起) 若存在于作用域中的某个函数或变量所拥有的名字,与某个非联合体类类型的名字相同,则可在其名字之前加上 struct 来消歧义,这产生一个详述类型说明符 union 联合体类型的声明 若存在于作用域中的某个函数或变量所拥有的名字与某个联合体类型的名字相同,则可在该名字之前加上 union 以...

阅读更多

C++中的lambda表达式

lambda表达式 lambda介绍 到目前为止,我们使用过的两种可调用对象有 函数 和 函数指针, 还有其它两种可调用对象:重载了调用运算符的类, 还有lambda表达式 一个lambda表达式表示一个可调用的代码单元。可理解为一个未命名的内联函数。与函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。lambda与函数不同的地方在于,lambda可以定义在函数内部。 形式: [capture list] (parameter list) -> return type { function body} 其中,capture list(捕获列表)是lambda表达式所在函数定义的局部变量列表(通常为空) return type 、parameter l...

阅读更多

C++11新特性之智能指针

动态内存与智能指针 动态内存 在C++中,动态内存的管理是通过一对运算符来完成的: new, 在动态内存中为对象分配空间并返回一个指向该对象的指针,也可以选择对对象进行初始化 delete, 接受一个动态对象的指针,销毁该对象,并释放与之关联的内存 智能指针 为了更容易,也更安全的使用动态内存,新的标准库提供了两种智能指针类型来管理动态对象。智能指针的行为类似于常规指针,区别在于它负责自动释放所指向的对象。 含义 shared_ptr 允许多个指针指向同一个对象 unique_ptr 只能”独占”所指向的对象 初始化 智能指针也是一个模板。所以,创建智能指针时,必须提供指针类型,与vector一样,在尖括号内给出类型。 shared...

阅读更多

C++11新特性之互斥锁包装器

lock_guard管理类 #include <mutex> template< class Mutex > class lock_guard; 类 lock_guard 是互斥体包装器,为在作用域块期间占有互斥提供便利 RAII 风格机制。 创建 lock_guard 对象时,它试图接收给定互斥的所有权。控制离开创建 lock_guard 对象的作用域时,销毁 lock_guard 并释放互斥。 lock_guard 类不可复制。 模板形参 Mutex - 要锁定的互斥。 成员类型 成员类型 定义 mutex_type Mutex ...

阅读更多

C++11新特性之thread线程

概述 #include <thread> class std::thread; std::thread 是C++11 新增的线程支持库的线程类,类 thread 表示单个执行线程。线程允许多个函数同时执行。 线程在构造关联的线程对象时立即开始执行(等待任何OS调度延迟),从提供给作为构造函数参数的顶层函数开始。顶层函数的返回值将被忽略,而且若它以抛异常终止,则调用 std::terminate 。顶层函数可以通过 std::promise 或通过修改共享变量(可能需要同步,见 std::mutex 与 std::atomic )将其返回值或异常传递给调用方。 成员类型 成员类型 : native_handle_type 成员类 class thread::i...

阅读更多

C++11新特性之recursive_mutex互斥锁

概述 #include <mutex> class std::recursive_mutex; recursive_mutex 类是同步原语,能用于保护共享数据免受从个多线程同时访问。 recursive_mutex 提供排他性递归所有权语义: 调用方线程在从它成功调用 lock 或 try_lock 开始的时期里占有 recursive_mutex 。此时期间,线程可以进行对 lock 或 try_lock 的附加调用。所有权的时期在线程调用 unlock 匹配次数时结束。 线程占有 recursive_mutex 时,若其他所有线程试图要求 recursive_mutex 的所有权,则它们将阻塞(对于调用 lock )或收到 false 返回值(对于...

阅读更多

C++11新特性之mutex互斥锁

概述 #include <mutex> class std::mutex; mutex 提供排他性非递归所有权语义: 调用方线程从它成功调用 lock 或 try_lock 开始,到它调用 unlock 为止占有 mutex 。 线程占有 mutex 时,所有其他线程若试图要求 mutex 的所有权,则将阻塞(对于 lock 的调用)或收到 false 返回值(对于 try_lock ). 调用方线程在调用 lock 或 try_lock 前必须不占有 mutex 。 若 mutex 在仍为任何线程所占有时即被销毁,或在占有 mutex 时线程终止,则行为未定义。 std::mutex 既不可复制亦不可移动。 成员类型 成员类型 : nativ...

阅读更多