Aprenda cmake a partir de la estructura organizativa del proyecto de mxnet

ilustrar

Esta serie presentará cómo MXNet usa CMake para organizar proyectos.

Esta serie de artículos cubre la mayoría de los comandos de CMake utilizados en el desarrollo real.

El código de este artículo proviene de MXNet .

¿Qué es CMake? ¿Por qué aprender CMake?

Para descubrir CMakequé hace, debemos comprender C++el proceso de desarrollo de todo el proyecto. Debido a mi capacidad limitada, aquí solo daré una breve introducción.
Después de escribir el código, el código debe compilarse a través de un compilador. Cuando el proyecto se vuelve grande, se vuelve muy problemático ingresar manualmente el comando de compilación después de cada compilación. Para resolver el problema, se requiere entrada manual para Cada compilación nació el problema del comando de compilación Makefile. El llamado Makefilees escribir el comando de compilación de todo el proyecto Makeifleen un archivo llamado. Solo necesita ingresar make cada vez para compilar todo el proyecto. Makefile implementa muchas operaciones convenientes, como buscar todos los archivos fuente a la vez, para que pueda No es necesario. Cada vez que agregue un archivo fuente, escriba un g++ filename.cpp -c -o filename.ocomando manualmente.
Aunque Makefilesolo necesita escribir el comando de compilación una vez, cuando el proyecto se vuelve enorme y necesita usar una biblioteca de terceros, la Makefileadministración será un poco problemática, además de esto, Makefilehay un problema más fatal: no puede admite muy bien multiplataforma, es decir, si necesita implementarlo para usarlo en dos plataformas diferentes, Makefilea menudo necesita escribir dos Makefilearchivos. Para resolver los problemas encontrados
anteriormente , existe . Lo que puede hacer, aquí hay una descripción del sitio web oficial:MakefileCMakeCMake

CMake es una familia de herramientas multiplataforma de código abierto diseñada para crear, probar y empaquetar software. CMake se utiliza para controlar el proceso de compilación de software utilizando archivos de configuración independientes del compilador y de la plataforma simple, y generar espacios de trabajo y archivos MAKE nativos que se pueden usar en el entorno del compilador de su elección. Kitware creó el conjunto de herramientas CMake en respuesta a la necesidad de un entorno de compilación potente y multiplataforma para proyectos de código abierto como ITK y VTK.

El significado aproximado de lo anterior en inglés CMakees una herramienta de construcción multiplataforma que se utiliza para generar Makefile. Este es Cmakeel objetivo principal.
CMakeAhora se ha convertido en C++una herramienta de construcción utilizada en muchos proyectos y su uso CMakese ha convertido en una tendencia general. Por eso el aprendizaje CMakees particularmente importante.

Introducción a MXNet

MXNetEs un marco de aprendizaje automático de código abierto que admite muchos lenguajes diferentes y puede facilitar a los usuarios la capacitación e implementación del aprendizaje automático. Todos están familiarizados con el uso Pythonde la instalación MXNetpara la capacitación en aprendizaje automático, y MXNetel código aquí proporciona una biblioteca dinámica. Los desarrolladores de diferentes idiomas la encapsularán de manera diferente y eventualmente llamarán a la biblioteca dinámica. MXNetLa biblioteca dinámica aquí se C++escribe usando y CMakeel proyecto se construye usando.

Estructura de organización del código MXNet

MXNetHay muchos subdirectorios bajo el directorio, solo debemos prestar atención a algunos de sus directorios y archivos:

Directorio src: almacena el código fuente y algunos archivos de encabezado
incluyen directorio: almacena archivos de encabezado de bibliotecas publicadas externamente
directorio de prueba: almacena casos de prueba
directorio cmake: almacena .cmakearchivos
Directorio de terceros: almacena archivos de bibliotecas de terceros
CMakeList.txt: CMakearchivos de configuración

Cómo utilizar CMake

Para usarlo, CMakesolo necesitamos escribir CMakeList.txtel archivo. Después de completar la escritura del archivo, podemos pasar cmakeel comando (debe asegurarse de que exista en la ubicación de ejecución. CMakeList.txtSi no existe, solo necesita ingresar la ruta del archivo después del comando). El comando generará Makefileel archivo por nosotros. Después de generar Makefileel archivo, solo necesitamos ejecutar makeel comando para comenzar a construir el proyecto.

CMakeList.txt en MXNet

A continuación, aprendamos MXNetcómo usarlo CMakepara construir. En la estructura de organización del código anterior, encontramos que además de su propio código fuente, el proyecto también utiliza bibliotecas de terceros, y estos terceros en realidad se construyen a través de CMake. las bibliotecas del partido CMakepueden gestionarse bien.

cmake_minimum_required(VERSIÓN 3.13)

Este comando se utiliza para especificar cmakeel número de versión mínimo. Cuando el número de versión es menor que el número de versión especificado, no 3.13continuará cmakeejecutándose, pero solicitará al usuario que actualice cmakela versión.

si () más si () más () endif ()

cmakeLas declaraciones de control lógico MXNetson las siguientes:

if(CMAKE_CROSSCOMPILING)
  set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING})
  set(__CMAKE_CROSSCOMPILING_OVERRIDE ON)
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)
    message(FATAL_ERROR "MXNet 2 requires a C++17 compatible compiler. Please update to GCC version 7 or newer.")
  endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
    message(FATAL_ERROR "MXNet 2 requires a C++17 compatible compiler. Please update to Clang version 6 or newer.")
  endif()
endif()

ifEl segundo parámetro de la declaración es la condición de juicio, que STREQUALse utiliza para juzgar si las dos cadenas son iguales y VERSION_LESSsi el número de versión anterior es menor que el número de versión posterior.
La primera ifdeclaración anterior se CMAKE_CROSSCOMPILINGejecutará ONcuando, y la declaración de juicio aquí debe usarse para la compilación cruzada.

Nota: La suma CMakeen se expresa por suma .truefalseONOFF

Nota: La compilación cruzada se utiliza principalmente para implementar la compilación de código para dispositivos integrados. Dado que el rendimiento de los dispositivos integrados es limitado, generalmente se compila en un host con un rendimiento sólido. El archivo (o biblioteca) de destino compilado se puede trasplantar al servidor integrado. dispositivo para su uso. .

colocar()

setLos comandos CMakese utilizan para definir variables en, por ejemplo:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)

Si desea obtener una determinada variable, puede ${VARIABLE_NAME}hacerlo.
setLos comandos también pueden establecer variables de búfer, que se pueden usar globalmente.

cmake variables incorporadas

Generalmente, CMAKElas variables que comienzan con ellas son cmakevariables integradas. Puede obtener el valor de cada variable de acuerdo con el método de obtención del valor de la variable. setLos valores de estas variables se pueden cambiar mediante comandos para lograr algunos propósitos especiales MXNet. variables integradas utilizadas en:

  • CMAKE_CROSSCOMPILING macro de compilación multiplataforma, esta macro se activará después de especificar el nombre del sistema
  • CMAKE_CXX_STANDARD se utiliza para especificar la versión de C++
  • CMAKE_CXX_STANDARD_REQUIRED Cuando esté activado, se utilizará la versión especificada en CMAKE_CXX_STANDARD. De lo contrario, se detendrá e informará un error. De lo contrario, se utilizará la versión anterior cuando esté desactivado.
  • CMAKE_CXX_EXTENSIONS Si se deben habilitar las extensiones del compilador para C++
  • CMAKE_CXX_COMPILER_ID El nombre del compilador como GNU
  • CMAKE_CXX_COMPILER_VERSION Número de versión del compilador
  • CMAKE_PROJECT_NAME El nombre del proyecto de nivel superior (si un proyecto contiene un subproyecto, entonces CMAKE_PROJECT_NAME en el subproyecto será el nombre del proyecto de nivel superior, no el nombre de su propio proyecto)
  • PROJECT_NAME El nombre del proyecto actual.
  • CMAKE_CURRENT_SOURCE_DIR La ruta absoluta del directorio de origen que se está procesando actualmente.

proyecto()

Este comando se utiliza para especificar el nombre del proyecto y el lenguaje de programación utilizado por el proyecto. MXNetEl ejemplo para especificar el nombre del proyecto como mxnetlenguaje de programación es C/C++:

project(mxnet C CXX)

mensaje()

Se utiliza para imprimir información de solicitud, similar a la salida del registro, que puede especificar la salida level. MXNetSe utilizan los siguientes level:

message(FATAL_ERROR "MXNet 2 requires a C++17 compatible compiler. Please update to GCC version 7 or newer.")
message(STATUS "CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}")
message(WARNING "Could not find NVML libraries")
message(ERROR " Only one of USE_JEMALLOC and USE_GPERFTOOLS can be defined at once")
message("After choosing blas, linking to ${mxnet_LINKER_LIBS}")

Nota: El nivel de registro determina el procesamiento que se producirá y qué ejecución FATAL_ERROEse detendrá . Nota: Cuando no se ingresa ningún nivel, significa que el mensaje es importante y el usuario debe prestar atención. Nota: No existe tal nivel en , pero este nivel se usa en y no se producen errores. Esto es algo que no entiendo del todo.cmake

cmakeERRORMXNet

incluir()

includeSe puede utilizar para introducir macros, módulos y un archivo.

  • Si introduce un archivo (generalmente con el sufijo .cmake), el uso en este momento es consistente con el uso de macros C/C++en includemxnet. El uso de introducir un archivo en mxnet es el siguiente:

    include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Utils.cmake)
    

    El comando anterior importará Utils.cmakealgunas funciones de herramientas y macros de uso común definidas en este archivo. \

  • mxnetLos módulos también se includeintroducen mediante comandos en , por ejemplo:

    include(CMakeDependentOption)
    

    CmakeDependentOptionLos principales métodos admitidos en este módulo se presentan arriba cmake_dependent_option.

cmake_dependent_option()

Este método se utiliza para establecer algunas variables macro. Las variables macro se establecen en un valor cuando se establece la dependencia y en otro valor cuando no se cumple la dependencia, como en un ejemplo en mxnet:

cmake_dependent_option(USE_NVML "Build with nvml support if found" ON "USE_CUDA" OFF)

USE_NVMLSerá cuando USE_CUDAesté hecho , será cuando esté hecho . Un ejemplo más complejo:ONONOFFOFF

cmake_dependent_option(A "this is description" ON "B;NOT C" OFF)

El código anterior significa que cuando Bse abre o Cse cierra, Ase abrirá; en otros casos, Ase cerrará.

opción()

Se utiliza para establecer una opción. La variable de esta opción se puede utilizar para establecer su valor al ejecutar el comando cmake -DOPTION_NAME=ON/OFF.

option(USE_NCCL "Use NVidia NCCL with CUDA" OFF)

Por ejemplo, arriba se establece una opción USE_NCCLy su valor predeterminado es OFFla cadena en el medio como descripción.

Para ser actualizado, última actualización el 2023.6.23

buscar_paquete()

ejecutar_proceso()

cadena()

add_compile_definitions()

agregar_definiciones()

comprobar_idioma()

habilitar_idioma()

buscar_programa()

Supongo que te gusta

Origin blog.csdn.net/qq_45523675/article/details/131400932
Recomendado
Clasificación