音视频编解码-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)

猜你喜欢

转载自blog.csdn.net/kris_paul/article/details/127262303