Cocos Creator:CMake 使用介绍

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

CMake 使用介绍

CMake 是一个跨平台的构建工具,可以根据需要输出各种生成文件或项目文件。CMake 用于配置项目文件,开发人员可以在其中集成 SDK 或参考库和配置来编译本机平台,请查看二次开发。CMakeLists.txt

从 v3.0 开始,创建者集成了 CMake 输出流程和基础创作。本文档重点介绍在本机平台上使用的规则和一些简单的示例。CMakeLists.txt

CMakeLists的生成和使用

在选择要构建的本机平台时,该目录将生成一个文件夹(例如:)和一个文件夹,CMake 将在首次运行时在这两个目录中生成文件,这些文件用于不同的目的:native\enginecurrent build platform nameandroidcommonCMakeLists.txt

在文件夹中:主要用于配置相应的构建平台。例如,对于Android平台:current build platform nameCMakeLists.txt

文件夹2

在文件夹中:主要用于配置整个项目。commonCMakeLists.txt

文件夹2

的语法相对简单,由命令注释空格组成。命令不区分大小写,但命令中的参数和变量区分大小写。CMakeLists.txt

用法

如何使用CMake将一个项目编译成其他项目的动态库?简单来说,先输入编译信息,然后 CMake 命令根据 中的配置生成编译所需的 Makefile 文件。CMakeLists.txt

以安卓平台为例,看看如何在项目目录中进行配置。CMakeLists.txtnative/engine/android

# Set the minimum version of CMake required. If the version of CMake used is lower than this version, the user will be reminded to upgrade to this version before executing CMake
cmake_minimum_required(VERSION 3.8)

# Declare the project name
option(APP_NAME "Project Name" "cmakeTest")

# Declare the project name and the supported programming languages, if not specified, all programming languages are supported by default, including C, C++ and JAVA, which are represented by C, CXX and JAVA respectively.
project(${APP_NAME} CXX)

# include loads and runs CMake code from a file or module
include(${CMAKE_CURRENT_LIST_DIR}/../common/CMakeLists.txt)

# Define a new variable LIB_NAME and set it to "cocos"
set(LIB_NAME cocos)

# Define a variable PROJ_SOURCES
set(PROJ_SOURCES
    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/Game.h
    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/Game.cpp
    ${CMAKE_CURRENT_LIST_DIR}/jni/main.cpp
)

# If jsb_module_register.cpp does not exist in this path, copy the jsb_module_register.cpp file in this path to the target folder
if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/jsb_module_register.cpp)
    file(_COPY "${COCOS_X_PATH}/cocos/bindings/manual/jsb_module_register.cpp"
        DESTINATION ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/)
endif()

# Add new element to PROJ_SOURCES
list(APPEND PROJ_SOURCES
    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/jsb_module_register.cpp
)

# Dynamic library PROJ_SOURCES generates a link file to LIB_NAME
add_library(${LIB_NAME} SHARED ${PROJ_SOURCES})

# Link the target file LIB_NAME with the library file cocos2d_jni
target_link_libraries(${LIB_NAME}
    "-Wl,--whole-archive" cocos2d_jni "-Wl,--no-whole-archive"
    cocos2d
)

# Add the include directories to the target folder.
target_include_directories(${LIB_NAME} PRIVATE
    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes
)

项目目录中的文件以相同的方式配置,但具有一些更基本的配置。例如:CMakeLists.txtnative/engine/common

option(USE_SPINE                "Enable Spine"                      ON)

构建后生成的发布包目录(例如:)有一个文件来存储当前项目的一些配置。由于引入了文件,当文件中的配置被修改时,它会同步到 ;如果配置相同,则直接覆盖,以文件中的配置为准。build/androidproj/cfg.cmakeCMakeLists.txtcfg.cmakecfg.cmakeCMakeLists.txtcfg.cmake

从 3.6.2 开始,开发人员可以覆盖 中写入的选项,并且该文件将从 GIT 中忽略。cfg.cmakenative/engine/common/localCfg.cmakelocalCfg.cmake

CMakeLists.txt

# Introduce cfg.cmake
include(${RES_DIR}/proj/cfg.CMake)

例如,取消选中编辑器主菜单项目->项目设置->特征裁剪中的脊柱动画

项目

然后将设置为在重新生成时再次构建:USE_SPINEOFFcfg.make

代码1

然后在编译时,CMake 根据配置(例如:和中介绍的配置文件)生成一个 CMakeCache.txt 文件,其中包含项目在构建时需要依赖的各种输入参数CMakeLists.txtcfg.makeCMakeLists.txt

代码2

CMakeLists通用编译指令

查找编译标头

找到编译头文件,CMake 将指定编译给定目标时要使用的包含目录或目标文件夹:

target_include_directories(<target> [SYSTEM] [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...]) ...])

通常,上述指令引用的库路径可以作为外部依赖项引入 CMake 中。例如:

# Add the Classes header library path to LIB_NAME
target_include_directories(${LIB_NAME} PRIVATE
    ${CMAKE_CURRENT_LIST_DIR}/../common/Classes
)

有关详细信息,请参阅官方 CMake target_include_directories文档。

生成“目标”(可执行文件)

上面的查找编译标头命令是由 、 和 命令生成的可执行文件。targetadd_libraryadd_executableadd_custom_command

由命令生成add_library

该指令从指定的源文件生成链接文件,然后将其添加到项目中。add_library

  add_library(<name> [STATIC | SHARED | MODULE])
          [EXCLUDE_FROM_ALL]
          [source1] [source2 ...])
  • name:添加一个名为 的目标库,该库是从命令(source1、source2)中列出的源文件构建的,在项目中全局唯一。如果源文件随后通过 target_sources() 指定,则可以在此处忽略它们。

STATIC(静态库)、(动态库)、(模块库):用于指定要创建的库的类型。静态库是目标文件的存档,用于链接到其他目标。共享库在运行时动态链接和加载。MODULE 库是不链接到其他目标的插件,但可以在运行时使用类似于 dlopen 的函数动态加载。SHAREDMODULE

示例如下:

add_library(${LIB_NAME} SHARED ${PROJ_SOURCES})

有关更多详细信息,请参阅官方 CMake add_library文档。

由命令生成add_executable

该命令使用指定的源文件生成目标可执行文件。add_executable

  add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                 [EXCLUDE_FROM_ALL]
                 [source1] [source2 ...])
  • name:可执行目标文件的名称,该文件在 CMake 项目中必须是全局唯一的。
  • WIN32:用于在Windows中创建以入口点为入口点的可执行目标文件(通常入口函数为),这是一个GUI应用程序,而不是控制台应用程序。使用 时,可执行目标将设置为 。WinMainmainWIN32WIN32_EXECUTABLEON
  • MACOSX_BUNDLE:用于在 macOSiOS 中创建 GUI 可执行应用程序。使用 时,可执行目标将设置为 。MACOSX_BUNDLEMACOSX_BUNDLEON
  • EXCLUDE_FROM_ALL:是否构建指定的可执行目标文件。使用此项时,不会生成可执行目标文件。

[source1] [source2 ...]:构建可执行目标文件所需的源文件。也可以使用 target_sources() 继续将源文件添加到可执行目标文件。请注意,可执行文件必须由调用或在调用之前定义。add_executableadd_librarytarget_sources

示例如下:

add_executable(hello-world hello-world.cpp)

有关更多详细信息,请参阅 CMake 官方文档add_executable。

由命令生成add_custom_command

该命令用于在两种情况下将自定义构建规则添加到生成的构建系统:add_custom_command

添加自定义命令以生成输出文件

 add_custom_command(OUTPUT output1 [output2 ...]
             COMMAND command1 [ARGS] [args1...]
             [COMMAND command2 [ARGS] [args2...] ...]
             [MAIN_DEPENDENCY depend]
             [DEPENDS [depends...]]
             [BYPRODUCTS [files...]]
             [IMPLICIT_DEPENDS <lang1> depend1
                                 [<lang2> depend2] ...]
             [WORKING_DIRECTORY dir]
             [COMMENT comment]
             [DEPFILE depfile]
             [JOB_POOL job_pool]
             [VERBATIM] [APPEND] [USES_TERMINAL]
             [COMMAND_EXPAND_LISTS])

一些参数的含义如下:

  • OUTPUT:指定命令预期生成的输出文件。输出文件名可以是绝对路径或相对路径(相对于当前生成的源目录路径)。

COMMAND:指定要在构建时执行的命令行。

示例如下:

add_custom_command(OUTPUT COPY_RES
      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${abs} $<TARGET_FILE_DIR:${LIB_NAME}>/${filename}
  )
注释
  1. 仅当在同一 中指定了依赖于其输出的所有目标时才有效。CMakeLists.txt
  2. 不要在多个相互独立的目标文件中同时执行上述命令来生成同一个文件,主要是为了防止冲突的发生。

将其他自定义命令添加到目标的构建过程中(例如:库或可执行文件)

 add_custom_command(TARGET <target>)
            PRE_BUILD | PRE_LINK | POST_BUILD
            COMMAND command1 [ARGS] [args1...]
            [COMMAND command2 [ARGS] [args2...] ...]
            [BYPRODUCTS [files...]]
            [WORKING_DIRECTORY dir]
            [COMMENT comment]
            [VERBATIM] [USES_TERMINAL]
            [COMMAND_EXPAND_LISTS])

一些参数的含义如下:

  • TARGET:指定命令运行的目标
  • COMMAND:指定要在构建时执行的命令行。有关该命令的详细信息,请参阅官方 CMake add_custom_command文档。add_custom_command

链接库文件

库文件的顺序符合链接顺序的规则,即依赖库放在依赖它的库之后。target_link_librariesgcc

target_link_libraries(<target> [item1] [item2] [...]
                      [[debug|optimized|general] <item>] ...)

item指示没有后缀名称的库文件。默认情况下,传递库依赖项。当此目标链接到另一个目标时,链接到此目标的库也将出现在另一个目标的链接行上。例如:

target_link_libraries(${LIB_NAME}
    "-Wl,--whole-archive" cocos2d_jni "-Wl,--no-whole-archive"
    cocos2d
)

有关详细信息,请参阅官方 CMake target_link_libraries文档。

其他命令

打印调试日志消息

  message(STATUS "my custom debug info")

操作文件命令

  file(_COPY "${COCOS_X_PATH}/cocos/bindings/manual/jsb_module_register.cpp"
      DESTINATION ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/)

COPY表示将文件、目录和符号链接复制到目标文件夹。输入路径是相对于当前源代码目录的路径。目标路径相对于当前生成目录。

从文件或模块加载和运行 CMake 代码

  include(${CMAKE_CURRENT_LIST_DIR}/../common/CMakeLists.txt)

CMakeLists使用示例

Android.mk 是Android源代码编译系统的Makefile,用于编译动态库,静态库,可执行文件,apk等。系统中的C++。下一步是在腾讯云多媒体引擎 SDK 中重写一个作为一个简单的示例。Android.mkCMakeLists.txt

中的代码如下:Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := Pre_GMESDK
LOCAL_SRC_FILES := ./$(TARGET_ARCH_ABI)/libgmesdk.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Pre_TRAE
LOCAL_SRC_FILES := ./$(TARGET_ARCH_ABI)/libtraeimp.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Pre_PTT
LOCAL_SRC_FILES := ./$(TARGET_ARCH_ABI)/libsilk.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := Pre_MP3
LOCAL_SRC_FILES := ./$(TARGET_ARCH_ABI)/libgmecodec.so
include $(PREBUILT_SHARED_LIBRARY)

其中有一个变量指示源文件在开发树中的位置。构建系统提供的宏函数将返回当前目录(文件本身所在的目录)的路径。LOCAL_PATHmy-dirAndroid.mk

LOCAL_PATH := $(call my-dir)

等效的将是:CMakeLists.txt

set(LOCAL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..)

以下部分中的代码:Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE := Pre_GMESDK
LOCAL_SRC_FILES := ./$(TARGET_ARCH_ABI)/libgmesdk.so
include $(PREBUILT_SHARED_LIBRARY)

等效的将是:CMakeLists.txt

add_library(Pre_GMESDK SHARED IMPORTED GLObal)
set_target_properties(Pre_GMESDK PROPERTIES
  IMPORTED_LOCATION ./${ANDROID_ABI}/libgmesdk.so
)

结论

CMake 包含一组广泛的命令。请继续了解它。未来,Cocos Creator 还将在编辑器的构建面板中集成更多 CMake 功能,以便于访问。

有关 CMake 语法和接口的更多详细信息,请参阅 CMake 官方文档。

3D建模学习工作室 翻译整理,转载请注明出处

上一篇:Cocos Creator:基于JSB桥的事件机械主义 (mvrlink.com)

下一篇:Cocos Creator:本机引擎内存泄漏检测系统 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号