CMakeLists.txt详解
CMakeLists.txt详解
CMakeLists.txt是一个用于构建C/C++项目的CMake配置文件。它定义了项目的编译选项,包括编译器类型、依赖库、预处理宏和子目录等。让我们逐步解析这个文件。
编译器检测
CMAKE_CXX_COMPILER_ID 变量用于检测编译器类型。在这个示例中,如果编译器是Clang,则设置 CLANG 为true;如果编译器是GCC,则设置 GCC 为true。这样可以根据不同的编译器类型设置相关选项。
编译选项
CMakeLists.txt 文件中定义了一系列的编译选项,例如:
WARNINGS_AS_ERRORS:将警告作为错误处理,如果启用此选项,则在编译过程中遇到任何警告都会导致构建失败。FILTER、ENCODER、DECODER、MUXER、DEMUXER:这些选项控制是否编译对应的过滤器、编码器、解码器、复用器和解复用器模块。ROCKFACE、ROCKX、RKNN:这些选项控制是否编译rockface、rockx和rknn封装模块。SANITIZER_STATIC、SANITIZER_DYNAMIC:这些选项用于在编译时启用地址和内存错误的静态或动态库。RKMEDIA_SOCKET:启用RKMedia套接字支持。
依赖库
CMakeLists.txt 文件使用 pkg_check_modules 函数查找并设置依赖库。示例中使用了 LIBDRM 和 LIBION 库。如果找到了这些库,则相应地设置预处理宏,并包含相关的头文件。
子目录
CMakeLists.txt 文件根据选项编译不同的子目录,包括 src 和 examples。在这些子目录中,可以编写项目源代码文件和示例代码,并设置链接库和其他编译选项。
其他配置
除了上述内容,CMakeLists.txt 文件还设置了一些其他配置,如设置编译器选项(C++11标准、禁用RTTI等)、预定义目标文件夹等。
下面是示例代码
#
# Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
## vi: set noexpandtab syntax=cmake:message(STATUS "cmake version ${CMAKE_VERSION}")
if(NOT CMAKE_VERSION VERSION_LESS "2.8.12.20131121")cmake_policy(SET CMP0025 OLD) # report Apple's Clang as just Clangcmake_policy(SET CMP0042 OLD) # do not require MACOSX_RPATH
endif()# Search packages for host system instead of packages for target system in case
# of cross compilation these macro should be defined by toolchain file
if(NOT COMMAND find_host_package)macro(find_host_package)find_package(${ARGN})endmacro()
endif()
if(NOT COMMAND find_host_program)macro(find_host_program)find_program(${ARGN})endmacro()
endif()list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")project(easymedia)cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
include(CheckIncludeFiles)
include(CheckFunctionExists)
include(CheckSymbolExists)
include(CheckCXXCompilerFlag)# ----------------------------------------------------------------------------
# set property to classify library kinds
# ----------------------------------------------------------------------------
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets")# ----------------------------------------------------------------------------
# Compiler detection
# ----------------------------------------------------------------------------
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")set(CLANG true)
endif()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")set(GCC true)
endif()if(CLANG)# treat clang roughly like gccset(GCC true)add_definitions(-Wall-Wextra-Wshadow-ffast-math)
elseif(CMAKE_COMPILER_IS_GNUCXX)add_definitions(-Wall-Wextra-Wshadow-ffast-math)check_cxx_compiler_flag(-Wno-narrowing GCC_HAS_NO_NARROWING)check_cxx_compiler_flag(-mstackrealign GCC_HAS_STACK_REALIGN)if(GCC_HAS_STACK_REALIGN)add_definitions(-mstackrealign)endif()execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversionOUTPUT_VARIABLE GCC_VERSION)
endif()if(${CMAKE_BUILD_TYPE} MATCHES "Release")set(CMAKE_C_VISIBILITY_PRESET hidden)set(CMAKE_CXX_VISIBILITY_PRESET hidden)
endif()# set c++11
set(CMAKE_CXX_STANDARD 11)
# rtti may be expensive on Embedded Platform, obey Google C++ Style Guide
# add_definitions(-fno-rtti)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")# add PIC flag
add_definitions(-fPIC)
# set (CMAKE_SHARED_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS})# add_definitions(-fvisibility=hidden -fvisibility-inlines-hidden)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden")
include_directories(./)if(USE_RKAIQ)find_package(RkAiq REQUIRED)include_directories(${RKAIQ_INCLUDE_DIRS})add_definitions(-DRKAIQ)
endif()if(AUDIO_ALGORITHM)add_definitions(-DAUDIO_ALGORITHM_ENABLE)
endif()# ----------------------------------------------------------------------------
# Build options
# ----------------------------------------------------------------------------
find_package(PkgConfig)
include(GNUInstallDirs)# ----------------------------------------------------------------------------
# Set Warning as Error
# ----------------------------------------------------------------------------
option(WARNINGS_AS_ERRORS "Stop compiles on first warning" OFF)
if(WARNINGS_AS_ERRORS)if(GCC)add_definitions(-Werror)elseif(MSVC)add_definitions(/WX)endif()
endif(WARNINGS_AS_ERRORS)option(FILTER "compile: filter" ON)
option(ENCODER "compile: encoder" ON)
option(DECODER "compile: decoder" ON)
option(MUXER "compile: muxer" ON)
option(DEMUXER "compile: demuxer" ON)
option(RKNN "compile: rknn wrapper" OFF)
option(ROCKFACE "compile: rockface wrapper" OFF)
option(ROCKX "compile: rockx wrapper" OFF)option(SANITIZER_STATIC "compile with sanitizer (static library linker)" OFF)
if(SANITIZER_STATIC)add_definitions(-fsanitize=address -static-libasan -g -ggdb -gdwarf -funwind-tables -rdynamic -O0)add_definitions(-fno-stack-protector -fno-omit-frame-pointer -fsanitize-recover=address)# add_definitions(-fsanitize=undefined)link_libraries(libasan.a dl m rt)
endif()option(SANITIZER_DYNAMIC "compile with sanitizer (dynamic library linker)" OFF)
if(SANITIZER_DYNAMIC)# NOTE: copy libasan.so with manual operationadd_definitions(-fsanitize=address -g -ggdb -gdwarf -funwind-tables -rdynamic -O0)add_definitions(-fno-stack-protector -fno-omit-frame-pointer -fsanitize-recover=address)# add_definitions(-fsanitize=undefined)link_libraries(asan)
endif()pkg_check_modules(LIBDRM libdrm)
if(LIBDRM_FOUND)add_definitions(-DLIBDRM)include_directories(${LIBDRM_INCLUDE_DIRS})set(EASY_MEDIA_DEPENDENT_LIBS drm)
else()
pkg_check_modules(LIBION libion)
if(LIBION_FOUND)add_definitions(-DLIBION)include_directories(${LIBION_INCLUDE_DIRS})set(EASY_MEDIA_DEPENDENT_LIBS ion)
endif()
endif()option(RKMEDIA_SOCKET "Enable rkmedia socket" OFF)
if(RKMEDIA_SOCKET)
add_definitions(-DRKMEDIA_SOCKET)
endif()if (MINILOGGER)
find_package(MiniLogger REQUIRED)
set(EASY_MEDIA_DEPENDENT_LIBS${EASY_MEDIA_DEPENDENT_LIBS} MiniLogger::MiniLogger)
add_definitions(-DRKMEDIA_SUPPORT_MINILOG)
endif()option(TIMESTAMP_DEBUG "Time-consuming statistics of each stage of MB" OFF)
if (TIMESTAMP_DEBUG)add_definitions(-DRKMEDIA_TIMESTAMP_DEBUG)
endif()option(COMPILES_MINIMEDIA "Enable compiles minimedia" OFF)
include_directories(include/easymedia)
include_directories(include/rkmedia)
add_subdirectory(src)option(COMPILES_EXAMPLES "Enable compiles examples" OFF)
if(COMPILES_EXAMPLES)include(CTest)enable_testing()add_subdirectory(examples)
endif()option(COMPILES_UVC_EXAMPLE "Enable compiles uvc example" OFF)相关文章:
CMakeLists.txt详解
CMakeLists.txt详解 CMakeLists.txt是一个用于构建C/C项目的CMake配置文件。它定义了项目的编译选项,包括编译器类型、依赖库、预处理宏和子目录等。让我们逐步解析这个文件。 编译器检测 CMAKE_CXX_COMPILER_ID 变量用于检测编译器类型。在这个示例中࿰…...
记一个JSON返回数据的bug
记一个JSON返回数据的bug:‘Object of type int64 is not JSON serializable’ 我在打包数组进行json数据返回时,有一个参数是numpy数组里计算出来的,类型为int64,直接进行json打包会报错 提示(‘Object of type int64 is not JSON serializa…...
毫米波雷达模块技术革新:在自动驾驶汽车中的前沿应用
随着自动驾驶技术的快速发展,毫米波雷达模块的技术革新成为推动这一领域的关键因素之一。本文将深入研究毫米波雷达模块技术的最新进展,并探讨其在自动驾驶汽车中的前沿应用。 毫米波雷达模块的基本原理 解释毫米波雷达模块的基本工作原理,强…...
优秀数据库模式迁移工具的发展历程
数据库模式迁移可能是应用程序开发中风险最大的领域——因为这是一个困难的、有风险的和痛苦的过程。数据库模式迁移工具的存在是为了减轻这种痛苦,并且已经取得了长足的进步:从基本的CLI工具到GUI工具,从简单的SQL GUI客户端到一体化协作数据…...
【深度学习】数据集最常见的问题及其解决方案
简介 如果您还没有听过,请告诉您一个事实,作为一名数据科学家,您应该始终站在一个角落跟你说:“你的结果与你的数据一样好。” 尝试通过提高模型能力来弥补糟糕的数据是许多人会犯的错误。这相当于你因为原来的汽车使用了劣质汽…...
Excel文件带有密码的只读模式,如何设置?
Excel带有密码的除了打开密码和工作表保护以外,其实还有一种可以设置密码的方法,今天给大家分享如何设置带有密码的只读模式。 打开excel文件,将文件进行【另存为】设置,然后停留在保存路径的界面中,我们点击下面的工…...
【Qt之json文件】json文件介绍及相关读写类介绍、示例
JSON介绍 JSON(JavaScript Object Notation)是一种源自Javascript的编码对象数据的轻量级的数据交换格式,易于理解和编写,JSON但现在已广泛用作互联网上的数据交换格式。 Qt提供了处理JSON数据的支持。Qt中的JSON支持提供了一个易…...
arp 隔离
目录 问题查找解决方式参考 问题 linux 在使用双网卡系统时,当这两个不同网段的网口接到同一个交换机上,会出现 eth0 的 arp 请求,会在 eth1 上收到并回复,相当于自己检测到了自己的 ip。 查找 linux 的底层,默认情…...
数据结构与算法(文章链接汇总)
数据结构与算法(一):概述与复杂度分析 数据结构与算法(二):数组与链表 数据结构与算法(三):栈与队列 数据结构与算法(四):哈希表 数据…...
代码随想录算法训练营第五十九天 | 647. 回文子串、516.最长回文子序列
647. 回文子串 链接: 代码随想录 (1)代码 516.最长回文子序列 链接: 代码随想录 (1)代码...
非关系型数据库-Redis
一、缓存概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存…...
HTML基本讲解与使用
目录 html的由来: 什么是HTML: HTML的主要特点: HTML文档结构: HTML元素: HTML元素属性: 文本和格式化: 链接和图像: 列表: 表格: 表单: 嵌套和结构: HTML注释: 样式…...
linux uname详解 -s -r -a 查看内核版本
简介 uname命令用于显示操作系统信息,例如内核版本、主机名、处理器类型等 uname常用的有-a,-r,-rs 参数 --help 显示帮助。-a 或--all 显示全部信息,包括内核名、主机名、内核版本、处理器类型和硬件架构等…...
Linux常用命令——cmp命令
在线Linux命令查询工具 cmp 比较两个文件是否有差异 补充说明 cmp命令用来比较两个文件是否有差异。当相互比较的两个文件完全一样时,则该指令不会显示任何信息。若发现有差异,预设会标示出第一个不通之处的字符和列数编号。若不指定任何文件名称或是…...
C语言之排序
1.冒泡排序 冒泡排序就不多说了,只需要两层循环嵌套,两两比较确定相对正确的顺序即可。 2.插入排序 插入排序的思想就是每一次向后寻找一个再将其与前面有序的部分进行对比,寻找合适位置插入。 这里关键要避免让前移超出目前读取的数字&…...
GitHub-使用 Git工具 创建密钥id_rsa.pub
快速导航 步骤1 打开Git Bash步骤2 输入指令【ssh-keygen】步骤3 打开创建的公钥文件步骤4 复制其中所有内容步骤5 打开GitHub中的Setting界面步骤6 添加SSH keys 步骤1 打开Git Bash 打开Git Bash 工具 步骤2 输入指令【ssh-keygen】 输入指令【ssh-keygen】,并…...
C++多重、多层、分层继承
在本文中,您将学习C 编程中的不同继承模型:带有示例的多继承,多层和分层继承。 继承是面向对象编程语言的核心功能之一。它允许软件开发人员从现有的类派生一个新的类。派生类继承基类(现有类)的功能。C 编程中有多种…...
ThingsBoard的数据分析-自定义节点来订阅kafka stream的消息
1、概述 在ThingsBoard官方文档中有说明:ThingsBoard 规则引擎支持对传入遥测数据的基本分析,例如阈值交叉。规则引擎背后的想法是提供基于设备属性或数据本身将数据从物联网设备路由到不同插件的功能。 然而,大多数现实生活中的用例也需要高级分析的支持:机器学习、预测分…...
Python WSGI HTTP Server - Gunicorn
基本概念 Gunicorn,也称为“Green Unicorn”,是一个Python WSGI HTTP Server,用于运行Python Web应用程序。WSGI(Web Server Gateway Interface)是Python应用程序和Web服务器之间的一个接口,允许应用程序和…...
[论文笔记]GPT-2
引言 今天继续GPT系列论文, 这次是Language Models are Unsupervised Multitask Learners,即GPT-2,中文题目的意思是 语言模型是无监督多任务学习器。 自然语言任务,比如问答、机器翻译、阅读理解和摘要,是在任务相关数据集上利用监督学习的典型方法。作者展示了语言模型…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
可视化预警系统:如何实现生产风险的实时监控?
在生产环境中,风险无处不在,而传统的监控方式往往只能事后补救,难以做到提前预警。但如今,可视化预警系统正在改变这一切!它能够实时收集和分析生产数据,通过直观的图表和警报,让管理者第一时间…...
codeforces C. Cool Partition
目录 题目简述: 思路: 总代码: https://codeforces.com/contest/2117/problem/C 题目简述: 给定一个整数数组,现要求你对数组进行分割,但需满足条件:前一个子数组中的值必须在后一个子数组中…...
