音视频编解码-6——Cmake文件配置

Cmake文件配置

在这里插入图片描述
以当前文件夹目录为例

一、外层配置在这里插入图片描述

外层CMakeList.txt文档详细书写:

1.版本记录

###############################################################################
#
# This file is part of CMake configuration
#
# 2022 明教张公子 
#
###############################################################################
# General settings
###############################################################################
# CMake的最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.7.0 FATAL_ERROR)
###########################################

2.命名

以项目名称为"SimplePlayer"为例

SET(APP_NAME "SimplePlayer" CACHE STRING  "set app name")

SET(IDE_TARGET_NAME "SimplePlayer")

PROJECT("SimplePlayer")

3.防止源代码内编译

#prevent in-source buildss
IF(NOT INSOURCEBUILD AND (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}))
    MESSAGE(FATAL_ERROR "
        CMake generation for this project is not allowed within the source directory!
        Remove the CMake cache files and try again from another folder, e.g.:
          rm -r CMakeCache.txt CMakeFiles/
          mkdir build
          cd build
          cmake ..
        If you really want an in-source build, pass -DINSOURCEBUILD=1"
            )
ENDIF()

4.设置Cmake生成的工程类型(Debug、Release)

# If the user specifies -DCMAKE_BUILD_TYPE on the command line, take their definition
# and dump it in the cache along with proper documentation, otherwise set CMAKE_BUILD_TYPE
# to Release prior to calling PROJECT()
IF(DEFINED CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
ELSE(DEFINED CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
ENDIF(DEFINED CMAKE_BUILD_TYPE)
ENABLE_TESTING()

5. 添加编译选项

###############################################################################
# wiSCADA CMake modules
###############################################################################
ADD_DEFINITIONS(-D_HAS_STD_BYTE=0)
ADD_DEFINITIONS(-DSDL_MAIN_HANDLED)
ADD_DEFINITIONS(-D__STDC_CONSTANT_MACROS)

6.各种目录

SET(变量名 $ 变量值)
SET不区分大小写

## NCQFC根目录
SET(NCQFC_ROOT
    ${CMAKE_CURRENT_SOURCE_DIR}/ncqfc
    )
	
	## 第三方库目录
SET(THIS_THIRDPARTY_ROOT
    ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty)

## 第三方库目录
SET(THIRDPARTY_ROOT
    ${CMAKE_CURRENT_SOURCE_DIR}/ncqfc/3rdparty)
	
SET(BREAKPAD_SOURCE_DIR 
   ${THIRDPARTY_ROOT}/breakpad)

# Path to additional CMake modules
SET(CMAKE_MODULE_PATH
    ${CMAKE_MODULE_PATH}
    ${NCQFC_ROOT}/cmake
    ${CMAKE_ROOT}/Modules
    ${CMAKE_SOURCE_DIR}/cmake    
)

set (BOOST_LIBRARYDIR 
${THIRDPARTY_ROOT}/boost/Windows/MSVC/x64/14.0) 

set (BOOST_INCLUDEDIR 
${THIRDPARTY_ROOT}/boost/include) 

set (BOOST_HOME 
${THIRDPARTY_ROOT}/boost) 

7.文件夹过滤器

MACRO(GENERATE_SOURCE_GROUPS curdir)
  file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*)
  foreach(child ${children})
    if(IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child})
      GENERATE_SOURCE_GROUPS(${curdir}/${child})
    else()
      string(REPLACE "/" "\\" groupname ${curdir})
	  string(REPLACE "src" "Source Files" groupname ${groupname})
      source_group(${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
    endif()

8.工程信息

##
INCLUDE(wisConfig)
# 工具
INCLUDE(wisUtilities)
# 版本
INCLUDE(wisVersion)
#############################################################
# 软件的发布版本号
STRING(TIMESTAMP NOW_DATE "%Y%m%d")
SET(TRANSFER_VERSION ${NOW_DATE} CACHE STRING  "set transfer version")
ADD_DEFINITIONS(-DTRANSFER_VERSION=\"${TRANSFER_VERSION}\")
#############################################################
#获取SVN信息
OPTION(SHOW_ARPA_SVN_REVISION "Show Arpa source svn version (default: off)" OFF)

IF(WIN32)
##
    SET(_WIN32_WINNT 0x0600 CACHE STRING "Define Windows API version to use.")
    ADD_DEFINITIONS(-D_WIN32_WINNT=${_WIN32_WINNT})
ENDIF()

## 工程采用Unicode
ADD_DEFINITIONS(-D_UNICODE -DUNICODE)

# 预编译头文件处理
#INCLUDE(wisPrecompiled)

INCLUDE(wisFindQt)
# macro that sets a default (path) if one wasn't specified
MACRO(SET_PATH variable default)
    IF(NOT ${variable})
        SET(${variable} ${default})
    ENDIF(NOT ${variable})
ENDMACRO(SET_PATH)

9.Cmake生成的工程文件

# 生成文件的路径
SET(BIN_DIR         ${CMAKE_BINARY_DIR}/../bin)
SET(LIB_DIR         ${CMAKE_BINARY_DIR}/../lib)
SET(PLUGIN_DIR      ${CMAKE_BINARY_DIR}/../plugins)
SET(SHARE_DIR       ${CMAKE_BINARY_DIR}/../share)
SET(PDB_DIR         ${CMAKE_BINARY_DIR}/../pdb)
EXECUTE_PROCESS(
        COMMAND ${CMAKE_COMMAND} -E make_directory ${BIN_DIR}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${LIB_DIR}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${PLUGIN_DIR}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${SHARE_DIR}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${PDB_DIR}
)
SET(LIBRARY_OUTPUT_PATH ${LIB_DIR})
SET(EXECUTABLE_OUTPUT_PATH ${BIN_DIR})

效果如图:
在这里插入图片描述

10.其他

# On Release builds cmake automatically defines NDEBUG, so we
# explicitly undefine it:
# This matches stripped (Release) and nonstripped (RelWithDebInfo) builds
if(CMAKE_BUILD_TYPE MATCHES "Rel.*" AND NOT MSVC)
    ADD_DEFINITIONS("-UNDEBUG")
endif()

IF(APPLE)
    # Make sure we can find the 'ibtool' program. we need it to compile xibs
    find_program(IBTOOL ibtool HINTS "/usr/bin" "${OSX_DEVELOPER_ROOT}/usr/bin")
    IF (${IBTOOL} STREQUAL "IBTOOL-NOTFOUND")
        MESSAGE (FATAL_ERROR "ibtool can not be found and is needed to compile the .xib files. It should have been installed with
                    the Apple developer tools. The default system paths were searched in addition to ${OSX_DEVELOPER_ROOT}/usr/bin")
    ENDIF ()
     ADD_DEFINITIONS("-x objective-c++")
    INCLUDE_DIRECTORIES(apple)
    # for objective-c++
    SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTARGET_OS_MAC")
    # for pure objective-c
    SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -x objective-c -DTARGET_OS_MAC")
ENDIF(APPLE)


## 全局Include路径
INCLUDE_DIRECTORIES(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${NCQFC_ROOT}
    ${CMAKE_BINARY_DIR}
	${THIRDPARTY_ROOT}
	${THIRDPARTY_ROOT}/ftd2xx/include
    ${NCQFC_ROOT}/google_breakpad/client
)

LINK_DIRECTORIES(
    ${LIB_DIR}
    )

二、文件夹索引

在这里插入图片描述
进入src文件夹以后,并没有需要编译的文件, 因此需要写一层CMakeLists做索引。
索引CMakeList.txt文档详细书写:

add_subdirectory(decode)
SET(DECODE_TARGET_LINK ${DECODE_TARGET_LINK} PARENT_SCOPE)

add_subdirectory(render)
SET(RENDER_TARGET_LINK ${RENDER_TARGET_LINK} PARENT_SCOPE)

add_subdirectory(app)

decode、render和app的不同在于:
app内部还需要一层索引
在这里插入图片描述
decode内部需要书写新的CMakeLists
在这里插入图片描述

三、内部配置

1.CMAKE文件

cmake文件的命名与当前项目名称有关,一般为name_dependencies本例中项目名称是decode,最终生成一个动态库,因此文件命名为:decode_dependencies
文件写法:
本例的name均为decode

# 项目名称
SET(WIS_PROJECT_NAME decode)

#搜索FFMPEG依赖库
include(${KOMPASS_THIRDPARTY_ROOT}/ffmpeg/x64/ffmpeg_dependencies.cmake)

#头文件路径
INCLUDE_DIRECTORIES(
	${THIRDPARTY_ROOT}
    ${KOMPASS_FFMPEG_INCLUDE_PATH}
	${THIRDPARTY_ROOT}/spdlog
)

#lib搜索路径
LINK_DIRECTORIES(
	${LIBRARY_OUTPUT_PATH}
	${PROJECT_BINARY_DIR}
    ${KOMPASS_FFMPEG_LIB_PATH}
)

##第三方依赖项
set(DEPENDENCIES
	${KOMPASS_FFMPEG_DEPENDENCIES}
)
#Qt库
SET(QT_MODULES 
	Core
	Gui
	Widgets
	WinExtras

2.CMakeList.txt

依旧是以decode为例

colormsg(_HIBLUE_ "---Start---Configuring decode")

## 加载项目依赖项的文件
include(${CMAKE_CURRENT_LIST_DIR}/decode_dependencies.cmake)

## 项目名称
PROJECT(${WIS_PROJECT_NAME})

# Header files.
FILE(GLOB_RECURSE HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/*.h")

# Source files
FILE(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")

# Resource files.
SET (RESOURCES
)

# Other files
SET(OTHER_FILES
	${CMAKE_CURRENT_LIST_DIR}/decode_dependencies.cmake
)

## 生成动态库
WIS_QT_INIT_LIBRARY_MODULE(FALSE FALSE)
SET(${PROJECTNAMEU}_TARGET_LINK ${${PROJECTNAMEU}_TARGET_LINK} PARENT_SCOPE)

colormsg(_HIBLUE_ "---End---")

3.补充说明

生成动态库
WIS_QT_INIT_LIBRARY_MODULE(FALSE FALSE)

生成EXE
WIS_QT_INIT_EXE_MODULE(TRUE TRUE)

其他

Linux介绍

Linux,作为一种免费使用和自由传播的类UNIX操作系统,具有许多显著的特点和广泛的应用领域。以下是关于Linux的详细介绍:

一、系统概述

  1. 起源:Linux最初由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它是基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
  2. 内核版本:Linux的内核版本遵循xx.yy.zz的格式,其中xx是主版本,yy是次版本,zz是末版本。小于2.6版本时,次版本奇数为开发版,偶数为稳定版;大于2.6版本后,有Longterm长期支持版本、stable稳定版本和mainline主线开发版本等。
  3. 发行版:Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。

二、主要特点

  1. 开放性:Linux遵循开放系统互连(OSI)国际标准,具有开放源码、没有版权、技术社区用户多等特点。
  2. 多用户与多任务:Linux支持多用户同时使用系统资源,每个用户对自己的资源有特定的权限,互不影响。同时,Linux能够同时执行多个程序,且各个程序的运行互相独立。
  3. 良好的用户界面:Linux向用户提供了两种界面:用户界面和系统调用。同时,Linux还为用户提供了图形用户界面,利用鼠标、菜单、窗口、滚劢条等设施,给用户呈现一个直观、易操作、交互性强的友好的图形化界面。
  4. 设备独立性:Linux把所有外部设备统一当作文件来看待,只要安装驱劢程序,任何用户都可以象使用文件一样,操纵、使用这些设备。
  5. 丰富的网络功能:Linux具有完善的内置网络功能,是开发路由交换设备的理想开发平台。
  6. 可靠的安全系统:Linux采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,为网络多用户环境中的用户提供了必要的安全保障。
  7. 良好的可移植性:Linux是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。

三、应用领域

  1. 企业级服务器:Linux常被用来架构WWW服务器、数据库服务器、邮件服务器和DNS服务器等。
  2. 嵌入式系统:Linux在消费电子产品、网络设备和物联网设备中非常流行。
  3. 桌面操作系统:虽然市场份额较小,但Linux桌面发行版如Ubuntu、Fedora等仍有一定的用户群。
  4. 科学研究与计算:Linux广泛应用于科研领域,特别是在需要大规模数据处理和复杂模拟的场合。
  5. 云计算与虚拟化:Linux支持如KVM、Docker等虚拟化和容器化技术,为云服务提供商提供虚拟机和容器服务。

总之,Linux因其开源、稳定、安全和高度可定制的特性,在全球范围内得到了广泛的应用。它不仅支撑着互联网的基础设施,推动着科技创新,还在改善人们日常生活的方方面面。

优缺点

Linux系统的优缺点可以概括如下:

一、优点:

  1. 开源和自由:Linux是一个开源的操作系统,用户可以自由地查看、修改和分发其源代码。这使得用户可以根据自身需求自定义和定制Linux操作系统,而且不需要支付额外的许可费用。
  2. 高度稳定性:Linux以其高度的稳定性而闻名,能够长时间运行而不需要重启,且具有出色的系统鲁棒性。这使得Linux在服务器、超级计算机和嵌入式系统等对稳定性要求高的环境中得到广泛应用。
  3. 安全性:Linux提供了多层次的安全机制,如文件权限、用户身份验证、防火墙和加密等。同时,Linux社区也及时地修复和更新操作系统中的安全漏洞,保护用户免受恶意攻击。
  4. 灵活性和可定制性:Linux操作系统具有极高的灵活性和可定制性。用户可以根据自己的需求选择不同的发行版,并根据需要安装和配置各种软件、服务和工具。
  5. 多用户和多任务支持:Linux支持多用户和多任务操作,多个用户可以同时登录并在同一时间执行多个任务,共享系统资源。
  6. 良好的性能和扩展性:Linux操作系统具有出色的性能和扩展性,既可以运行在低端硬件上,也可以利用高端硬件的性能优势。此外,Linux在处理大量并发请求、网络传输和数据处理方面表现出色。
  7. 大量的开源软件支持:Linux拥有庞大的软件生态系统,其中包括各种开源应用程序、库和工具。用户可以方便地访问和使用这些软件,满足各种需求。

二、缺点:

  1. 学习曲线高:Linux操作系统的学习曲线比其他操作系统更陡峭,因为它需要一些基本的指令操作能力,这可能对初学者来说学习曲线较高。
  2. 兼容性问题:Linux操作系统并不总是与所有硬件和软件都兼容,这可能导致一些设备驱动程序或应用程序无法正常工作。
  3. 缺乏商业支持:相对于一些商业运作系统,Linux系统在商业支持和服务方面可能存在不足。
  4. 硬件要求:某些Linux发行版可能需要更高的硬件要求,这些可能会限制它在一些旧硬件上的使用。

总的来说,Linux系统以其开源、稳定、安全、灵活和高效的特点,在服务器、超级计算机、嵌入式系统和个人计算机等领域发挥着重要作用。然而,其较高的学习曲线和兼容性问题也是用户需要考虑的因素。

应用场景

Linux系统具有广泛的应用场景,以下是一些主要的应用领域:

  1. 服务器领域:
    Web服务器:Linux是Web服务器最常用的操作系统之一,如Apache、Nginx等Web服务器软件在Linux上运行得非常稳定。
    数据库服务器:如MySQL、PostgreSQL等关系型数据库管理系统在Linux上运行广泛,用于存储和管理大量数据。
    文件服务器:Linux可以通过NFS、SMB/CIFS等协议提供文件共享服务,满足企业或组织的文件存储和访问需求。
    邮件服务器:如Postfix、Sendmail等邮件服务器软件在Linux上运行,用于处理邮件的接收、发送和存储。
    应用服务器:Linux可以运行各种应用服务器软件,如Tomcat、JBoss等,用于部署和运行Web应用程序。
  2. 嵌入式系统:
    Linux被广泛应用于嵌入式系统领域,如路由器、交换机、智能手机、平板电脑、智能电视等。由于其小巧、高效和可定制的特性,Linux成为嵌入式系统开发的理想选择。
  3. 云计算和虚拟化:
    Linux是云计算和虚拟化技术的重要组成部分。它支持各种虚拟化技术,如KVM(Kernel-based Virtual Machine)、Docker等,用于构建和管理云计算环境。
    Linux也广泛应用于云服务平台,如OpenStack、CloudStack等,提供强大的云计算功能和服务。
  4. 高性能计算:
    Linux在科学计算、大数据分析、人工智能等领域具有广泛的应用。它支持各种高性能计算软件和框架,如MPI(Message Passing Interface)、Hadoop、TensorFlow等,满足高性能计算的需求。
  5. 桌面应用:
    尽管Linux在桌面市场的份额相对较小,但它仍然有一些忠实的用户群体。Linux桌面发行版如Ubuntu、Fedora、Debian等提供了丰富的桌面应用程序和友好的用户界面,满足用户的日常办公和娱乐需求。
  6. 网络安全:
    Linux在网络安全领域发挥着重要作用。它支持各种网络安全软件和工具,如防火墙、入侵检测系统(IDS)、安全信息事件管理(SIEM)等,用于保护网络和系统的安全。
  7. 物联网(IoT):
    随着物联网技术的快速发展,Linux在物联网领域的应用也越来越广泛。它支持各种物联网设备和传感器,提供可靠的数据传输和处理能力,实现物联网设备的互联互通和智能化管理。

总之,Linux系统具有广泛的应用场景,无论是在服务器、嵌入式系统、云计算和虚拟化、高性能计算、桌面应用、网络安全还是物联网领域,Linux都发挥着重要的作用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明教张公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值