[CMake entrada y avanzado (4)] CMakeLists.txt reglas gramaticales básicas y algunas instrucciones de uso común, continuación (con código)

        Debido a problemas de espacio, este artículo continúa introduciendo los conceptos básicos de las reglas gramaticales e instrucciones comunes de CMakeLists.txt.

  • directorio_fuente_auxiliar

        El comando aux_source_directory encontrará todos los archivos fuente en el directorio y su definición de comando es la siguiente:

aux_source_directory(<dir> <variable>)

        Encuentre todos los archivos de origen del directorio especificado y almacene la información de la ruta del archivo de origen escaneado en variables, por ejemplo, la estructura del directorio es la siguiente:

├── build
├── CMakeLists.txt
└── src
  ├── 1.c
  ├── 2.c
  ├── 2.cpp
  └── main.c

        El contenido de CMakeCache.txt es el siguiente:

# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

# 查找 src 目录下的所有源文件
aux_source_directory(src SRC_LIST)
message("${SRC_LIST}") # 打印 SRC_LIST 变量

        Vaya al directorio de compilación, ejecute el comando cmake .. y la información impresa es la siguiente: 

         Se puede ver que aux_source_directory agregará cada archivo de origen escaneado a la variable SRC_LIST para formar una lista de cadenas separadas por un punto y coma ";".

        De manera similar, aux_source_directory puede usar una ruta relativa o una ruta absoluta, y la ruta relativa es relativa a la ruta del código fuente actual.

  •  get_target_property y set_target_properties

        Atributos para obtener/establecer objetivos respectivamente.

  • incluir_directorios incluir_directorios

        El comando se utiliza para establecer la ruta de búsqueda del archivo de cabecera, que es equivalente a la opción -I de gcc, y su definición es la siguiente:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

        De manera predeterminada, el directorio especificado se agregará al final de la lista de búsqueda de archivos de encabezado (se puede considerar que cada código fuente de CMakeLists.txt tiene su propia lista de búsqueda de archivos de encabezado), puede cambiar su comportamiento predeterminado configurando la variable CMAKE_INCLUDE_DIRECTORIES_BEFORE en ON y agregue el directorio al principio de la lista. También puede usar la opción DESPUÉS o ANTES cada vez que llama al comando include_directories para especificar si desea agregarlo al principio o al final de la lista. Si se utiliza la opción SYSTEM, el directorio especificado se considerará como el directorio de búsqueda del sistema. Se puede usar una ruta absoluta para especificar el directorio de búsqueda del archivo de encabezado, o se puede usar una ruta relativa, y la ruta relativa se interpreta como la ruta relativa de la ruta del código fuente actual.

        Por ejemplo, la estructura del directorio del proyecto es la siguiente:

├── build
├── CMakeLists.txt
├── include
│ └── hello.h
└── main.c

        El archivo fuente main.c usa el archivo de encabezado hello.h en el directorio de inclusión, y el contenido de CMakeLists.txt es el siguiente:

# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

include_directories(include)
add_executable(hello main.c)

        Use el comando include_directories para agregar la carpeta de inclusión en el directorio actual a la lista de búsqueda de archivos de encabezado, ingrese al directorio de compilación y ejecute cmake y make para compilar y compilar. No hay problema en el proceso de compilación y no habrá ningún error. indicando que no se puede encontrar el archivo de encabezado; pero si elimina el comando include_directories (include), la compilación definitivamente informará un error, ¡puede intentarlo usted mismo!

        De forma predeterminada, el directorio de inclusión se agrega al final de la lista de búsqueda de archivos de encabezado y se puede especificar explícitamente para que se agregue después o antes de la lista a través de las opciones DESPUÉS o ANTES:

# 添加到列表后面
include_directories(AFTER include)

# 添加到列表前面
include_directories(BEFORE include)

        Cuando se llama al comando add_subdirectory para cargar el código fuente secundario, la lista de directorios contenidos en el comando include_directories se pasará al código fuente secundario (el código fuente secundario se hereda del código fuente principal). Por ejemplo, la estructura del directorio del proyecto es la siguiente:

├── build
├── CMakeLists.txt
├── include
│ └── hello.h
└── src
  ├── CMakeLists.txt
  └── main.c

        El archivo de encabezado hello.h se usa en el archivo fuente main.c en el directorio src, y el contenido del CMakeLists.txt de nivel superior es el siguiente:

# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

include_directories(include)
add_subdirectory(src)

        El código fuente CMakeLists.txt de nivel superior llama a include_directories para agregar el directorio de inclusión a la lista de búsqueda de archivos de encabezado del código fuente actual y luego llama al comando add_subdirectory para cargar y ejecutar el código fuente secundario; el contenido de CMakeLists.txt en el directorio src es el siguiente:

# src 目录 CMakeLists.txt
add_executable(hello main.c)

        Vaya al directorio de compilación, compile y compile, y todo el proceso de compilación no será un problema.

  • link_directories 和 link_libraries link_directories

        El comando se usa para establecer la ruta de búsqueda de los archivos de la biblioteca, lo que equivale a la opción -L del compilador gcc; el comando link_libraries se usa para establecer los archivos de la biblioteca a vincular, lo que equivale a la opción -l del compilador compilador gcc; la definición del comando es la siguiente:

link_directories(directory1 directory2 ...)
link_libraries([item1 [item2 [...]]]
                 [[debug|optimized|general] <item>] ...)

        link_directories agregará el directorio especificado a la lista de búsqueda de archivos de biblioteca (se puede considerar que cada código fuente de CMakeLists.txt tiene su propia lista de búsqueda de archivos de biblioteca); de manera similar, el comando link_libraries agregará el archivo de biblioteca especificado a la lista de biblioteca de enlaces. El comando link_directories puede usar rutas absolutas o relativas para especificar directorios, y las rutas relativas se interpretan como relativas a la ruta del código fuente actual.

        Por ejemplo, la estructura del directorio del proyecto es la siguiente:

├── build
├── CMakeLists.txt
├── include
│ └── hello.h
├── lib
│ └── libhello.so
└── main.c

        Hay un archivo de biblioteca dinámica libhello.so en el directorio lib, libhello.so debe vincularse al compilar y vincular el archivo fuente main.c; el contenido del archivo CMakeLists.txt es el siguiente:

# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

include_directories(include)
link_directories(lib)
link_libraries(hello)
add_executable(main main.c)

        El nombre del archivo de la biblioteca se puede abreviar o el nombre completo del archivo de la biblioteca, por ejemplo:

# 简写
link_libraries(hello)

# 全称
link_libraries(libhello.so)

        El comando link_libraries también puede especificar la ruta completa del archivo de la biblioteca (ruta absoluta/comienzo).Si no está al comienzo de /, link_libraries pensará que la persona que llama pasó el nombre del archivo de la biblioteca en lugar de la ruta completa de el archivo de la biblioteca Por ejemplo, el CMakeLists.txt anterior se puede modificar de esta manera:

# 顶层 CMakeLists.txt
cmake_minimum_required("VERSION" "3.5")
project("HELLO")

include_directories(include)
link_libraries(${PROJECT_SOURCE_DIR}/lib/libhello.so)
add_executable(main main.c)

        Al igual que el comando include_directories, cuando se llama al comando add_subdirectory para cargar el código de subfuente, la lista de directorios contenida en el comando link_directories y la lista de bibliotecas de enlaces contenida en el comando link_libraries se pasarán al código de subfuente (el código de subfuente se hereda del código fuente principal). Aquí ya no es una demostración, puedes probarlo tú mismo.

  • lista

        El comando de lista es un comando sobre operaciones de lista, como obtener la longitud de la lista, devolver el elemento especificado por el valor de índice de la lista, agregar el elemento a la lista, etc. Los comandos se definen de la siguiente manera:

list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
      <output variable>)
list(APPEND <list> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

           El concepto de una lista aún no se le ha presentado. Una lista es en realidad una matriz de cadenas (o una lista de cadenas, o una matriz de cadenas), que le explicaré más adelante.

        La opción LENGTH se usa para devolver la longitud de la lista;

        La opción GET devuelve el elemento especificado por el valor de índice de la lista;

        La opción APPEND agrega elementos a la lista;

        La opción FIND devolverá el valor de índice del elemento especificado en la lista, o -1 si no se encuentra.

        La opción INSERT insertará un elemento en la lista en la posición especificada.

        Las opciones REMOVE_AT y REMOVE_ITEM eliminarán elementos de la lista, la diferencia es que REMOVE_ITEM eliminará el elemento dado, mientras que REMOVE_AT eliminará el elemento en el valor de índice dado.

        La opción REMOVE_DUPLICATES eliminará los elementos duplicados de la lista.

        La opción REVERSE invierte el contenido de la lista en el lugar.

        La opción ORDENAR ordena la lista alfabéticamente.

  • mensaje

        El comando de mensaje se usa para imprimir y generar información, similar al comando echo de Linux, la definición del comando es la siguiente:

message([] "message to display" ...)

        La palabra clave de modo opcional se utiliza para determinar el tipo de mensaje, de la siguiente manera:

modo ilustrar
ninguno Ninguno) información importante, información general
ESTADO Información adicional
ADVERTENCIA CHacer advertencia, continuar procesando
AUTOR_ADVERTENCIA CMake advertencia (desarrollo), continuar procesando
ENVIAR ERROR C Comete un error, continúe procesando, pero omita la compilación
ERROR FATAL C Comete un error, deja de procesar y construye
DEPRECACIÓN CMake desaprueba los errores o advertencias si las variables CMAKE_ERROR_DEPRECATED o CMAKE_WARN_DEPRECATED respectivamente están habilitadas; de lo contrario, no hay mensaje.

        Por lo tanto, puede usar este comando como una declaración de impresión de salida en el código fuente de CMakeLists.txt, por ejemplo:

# 打印"Hello World"
message("Hello World!")

Continuará...

Supongo que te gusta

Origin blog.csdn.net/cj_lsk/article/details/131062552
Recomendado
Clasificación