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,中文题目的意思是 语言模型是无监督多任务学习器。 自然语言任务,比如问答、机器翻译、阅读理解和摘要,是在任务相关数据集上利用监督学习的典型方法。作者展示了语言模型…...
3分钟搞定ESP8266固件烧录:NodeMCU PyFlasher终极指南
3分钟搞定ESP8266固件烧录:NodeMCU PyFlasher终极指南 【免费下载链接】nodemcu-pyflasher Self-contained NodeMCU flasher with GUI based on esptool.py and wxPython. 项目地址: https://gitcode.com/gh_mirrors/no/nodemcu-pyflasher 还在为ESP8266固件…...
智能AI换装软件下载-开源PHP试衣系统-上传图片自动生成高清试衣图-支持连衣裙/上下衣
温馨提示:文末有资源获取方式做电商的朋友都知道,服装类目最烧钱的就是模特拍摄。请模特、租场地、请摄影师、后期修图……一套流程下来,少说几千块,多则上万。关键是,每个季度都要拍,每个款式都要拍&#…...
B站会员购抢票神器:新手也能快速上手的终极购票指南
B站会员购抢票神器:新手也能快速上手的终极购票指南 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 还在为抢不到B站会员购的漫展门票而烦恼吗?biliTickerBuy是一款开源…...
家用设备部署轻量级对话AI:从模型选择到实践优化
1. 项目概述:在家打造专属对话AI三年前我第一次接触大语言模型时,需要租用昂贵的云服务器才能运行基础版本。如今随着模型优化和硬件发展,在消费级设备上部署轻量级对话AI已成为可能。这个项目将带你在家用显卡或甚至纯CPU环境下,…...
从交通拥堵到疫情预测:手把手教你用STGNN模型解决5个城市计算难题
从交通拥堵到疫情预测:STGNN模型实战指南 城市计算领域正迎来一场由时空图神经网络(STGNN)驱动的技术变革。这种能够同时捕捉空间关联与时间动态的AI模型,正在重塑我们对城市复杂系统的理解方式。不同于传统时序预测方法ÿ…...
Intel Realsense D435在Windows上从零配置到显示彩色图像(VS2022 + OpenCV 4.8 + SDK 2.54)
Intel Realsense D435在Windows平台下的完整开发指南:从环境配置到彩色图像显示 1. 开发环境准备与SDK安装 在开始使用Intel Realsense D435深度相机进行开发前,我们需要搭建一个稳定的开发环境。Windows平台下推荐使用Visual Studio 2022作为主要开发工…...
XSS‘OR高级功能揭秘:加密算法与payload库深度探索
XSSOR高级功能揭秘:加密算法与payload库深度探索 【免费下载链接】xssor2 XSSOR - Hack with JavaScript. 项目地址: https://gitcode.com/gh_mirrors/xs/xssor2 XSSOR是一款专注于JavaScript安全测试的工具,全称"XSSOR - Hack with JavaScr…...
别再死记硬背了!用‘移动语义’和‘完美转发’实战优化你的C++ STL vector性能
现代C性能优化实战:移动语义与完美转发在STL vector中的应用 1. 从拷贝到移动:理解C性能优化的关键转折 在传统C编程中,对象拷贝是性能损耗的主要来源之一。当我们在处理STL容器特别是vector时,这个问题尤为突出。考虑以下场景&am…...
手把手教你用MobSF REST API:把App安全测试集成到Jenkins流水线里
手把手教你用MobSF REST API:把App安全测试集成到Jenkins流水线里 在DevSecOps实践中,移动应用安全测试的自动化集成已成为保障交付质量的关键环节。MobSF作为一款开源的移动安全测试框架,其REST API功能为CI/CD流水线提供了无缝对接能力。本…...
远程开发环境突然断连?资深SRE披露VSCode Remote Extension 1.92+版本3个未公开的session保活机制
更多请点击: https://intelliparadigm.com 第一章:远程开发环境断连现象的典型特征与影响面分析 远程开发环境(如 VS Code Remote-SSH、GitHub Codespaces、JetBrains Gateway)在企业级协作中日益普及,但其稳定性高度…...
