Entrada de Makefile simple y fácil de entender (03) - búsqueda de archivo de destino (la diferencia y el uso de VPATH y vpath), reglas implícitas

1. Búsqueda de archivos de destino (VPATH y vpath)

Si el archivo que se necesita está presente en una ruta diferente (es decir, el archivo de origen y Makefileel archivo no están en la misma ruta), en el momento de la compilación, utilice una Makefilebúsqueda funcional de archivos en un directorio para nosotros.

Existen principalmente dos métodos de búsqueda comunes:

  • VPATH Es una variable, necesita especificar la ruta del archivo cuando la usa, y son todos los archivos bajo la ruta de búsqueda;
  • vpathEs una palabra clave, búsqueda según el patrón, también se puede decir que es una búsqueda selectiva. Al buscar, no solo es necesario agregar la ruta del archivo, sino que también es necesario agregar las condiciones restrictivas correspondientes;

1.1 VPATH

En Makefilepuede escribir:

VPATH := dir

Podemos entender el dirvalor de asignación a la variable VPATH, por lo que el maketiempo de ejecución será desde el dirdirectorio de búsqueda de archivos que necesitamos.

Cuando hay varias rutas, podemos escribir:

VPATH := dir dir2

o

VPATH := dir:dir2

Utilice espacios o dos puntos para separar varias rutas, lo que significa buscar archivos en varias rutas. El orden del orden de búsqueda para que lo escribamos, debe buscar en direl directorio de archivos y luego buscar dir2archivos en un directorio.

Nota: No importa cuántas rutas se definan, makecuando se ejecute primero buscará archivos en el directorio actual, no hay archivo que estemos buscando para el directorio actual, solo vaya a VPATHla ruta para buscar. Si queremos usar el archivo en el directorio actual, makeusará los archivos en nuestro directorio actual.

La estructura del directorio de código es la siguiente:

wohu@ubuntu:~/cpp/demo$ tree
.
├── header
│   └── name.h
├── Makefile
└── source
    ├── main.cpp
    └── name.cpp

2 directories, 4 files
wohu@ubuntu:~/cpp/demo$

MakefileEn headery sourcecatalogar el mismo directorio. Escrito Makefilecomo sigue:

main: main.o name.o
	g++ main.o name.o -o main

Se makedará ejecución :

make: *** No rule to make target 'main.o', needed by 'main'.  Stop.

El objetivo final es reconstruir el archivo maincuando necesitamos main.oarchivar, pero no encontramos main.oel archivo, que es la causa principal del error.

Más búsqueda de ruta

VPATH = source header
main: main.o name.o
	g++ main.o name.o -o main

Ingrese make para ejecutar normalmente

wohu@ubuntu:~/cpp/demo$ make
g++    -c -o main.o source/main.cpp
g++    -c -o name.o source/name.cpp
g++ main.o name.o -o main
wohu@ubuntu:~/cpp/demo$ 

3.2 vpath

Uso específico:

vpath PATTERN DIRECTORIES 
vpath PATTERN
vpath

entre ellos:

  • PATTERN: Para encontrar las condiciones;
  • DIRECTORIES: El camino para encontrar;

El primero es el uso uno, el formato del comando es el siguiente:

vpath main.cpp dir

Se puede entender, en la dirbúsqueda de archivos debajo de la ruta main.cpp. Las reglas de escritura de múltiples rutas son las siguientes:

vpath main.cpp dir dir2         或者是         vpath main.cpp dir : dir2

De hecho, el uso de rutas múltiples y VPATHson similares con un espacio o dos puntos separados, es el primer orden de la ruta de búsqueda del dirdirectorio, luego el dir2directorio.

Seguido por el uso dos, el formato del comando es el siguiente:

vpath main.cpp

El uso de Two significa borrar main.cppdirectorios de búsqueda de archivos específicos .

El último es el uso tres, el formato del comando es el siguiente:

vpath

vpath Por separado significa borrar todas las rutas de búsqueda de archivos que se han establecido.

También el uso del vpathtiempo, puede incluirse en el modo de carácter de condición de búsqueda %, este símbolo es el papel de una coincidencia o una pluralidad de caracteres, como %.cppindicar que todos los .cpparchivos de ruta de búsqueda terminan. Si no está incluido en los criterios de búsqueda %, el archivo buscado es el nombre de archivo específico.

Los VPATHcasos de uso son menos en la ruta antes del archivo, o la búsqueda de archivos no puede usar la notación comodín que se usa en estos casos de VPATHla mejor manera.

Si hay un archivo especial de múltiples rutas o puede usar comodines cuando se indique, no se recomienda usar VPATHeste método, ¿por qué?

Debido VPATHa que a la hora de buscar el archivo no hay restricciones, por lo que se volvió a recuperar todos los archivos de este directorio, cada archivo comparará, buscará y nombrará el mismo directorio que no solo puede ser lento, sino ineficiente.

Podemos usar en este caso la vpathbúsqueda, que incluye limitar las condiciones de búsqueda cuando la búsqueda solo buscará el objetivo de las condiciones que establezcamos, el filtro no se ajusta al documento de requisitos, por supuesto, el tiempo de búsqueda será relativamente rápido.

Ejemplo de uso:

vpath %.cpp source
main: main.o name.o
	g++ main.o name.o -o main

2. Reglas implícitas

La llamada regla implícita es que el sistema completa automáticamente algunas acciones. En algunos casos, en realidad no es necesario dar el comando para reconstruir el archivo de destino, y algunos incluso no necesitan dar las reglas.
P.ej:

vpath %.cpp source
main: main.o name.o
	g++ main.o name.o -o main

Después de ejecutar make, el resultado de salida:

wohu@ubuntu:~/cpp/demo$ make
g++    -c -o main.o source/main.cpp
g++    -c -o name.o source/name.cpp
g++ main.o name.o -o main
wohu@ubuntu:~/cpp/demo$ 

El sistema ejecutó automáticamente las siguientes dos líneas de declaraciones

g++    -c -o main.o source/main.cpp
g++    -c -o name.o source/name.cpp

Nota: Las condiciones implícitas solo pueden omitir los comandos y reglas para la reconstrucción del archivo de destino intermedio, pero los comandos y reglas para el destino final no se pueden omitir.

Lo siguiente makefilees equivalente a lo anterior.

vpath %.cpp source
main: main.o name.o
	g++ main.o name.o -o main
main.o: main.cpp
	g++ -c ./source/main.cpp -o main.o 
name.o: name.cpp 
	g++ -c ./source/name.cpp -o name.o

Ejecución make, los resultados de salida:

wohu@ubuntu:~/cpp/demo$ make 
g++ -c ./source/main.cpp -o main.o 
g++ -c ./source/name.cpp -o name.o
g++ main.o name.o -o main
wohu@ubuntu:~/cpp/demo$ 

Tenga en cuenta que: al VPATH/vpathinformar la ruta de búsqueda de archivos se informa que makeesto es propicio para la búsqueda de archivos cuando se deduce implícitamente, no se informa gcc, todavía tienen que pasar -Iespecificado gcccuando la ruta de búsqueda de archivos de encabezado precompilado.

2.1 Reglas implícitas para variables de comando

La escritura Makefilese puede escribir directamente shellcon estas variables. Éstos son solo algunos de los C/C++relacionados:

nombre de la variable sentido
RM rm -f
CON Con
CC cc
CXX g ++

Ejemplo:

all:
    @echo $(RM)
    @echo $(AR)
    @echo $(CC)
    @echo $(CXX)

Ejecutar make, mostrar el valor de cada variable

wohu@ubuntu:~/cpp/func$ make 
rm -f
ar
cc
g++
wohu@ubuntu:~/cpp/func$ 

2.2 Variables de parámetros de comando

nombre de la variable sentido
ARFLAGS Parámetros del comando AR
CFLAGS Parámetros del compilador de lenguaje C
CXXFLAGS Parámetros del compilador del lenguaje C ++

Ejemplo: debajo de CXXFLAGSun ejemplo para mostrar

#include <iostream>

int main(int argc, char *argv[])
{
    
    
    std::cout << "hello,world" << std::endl;
    return 0;
}

Makefile contenido

CXXFLAGS += -Wall
main: demo.o
	$(CXX) demo.o -o main

llevado a cabo make

wohu@ubuntu:~/cpp/func$ make
g++ -Wall   -c -o demo.o demo.cpp   <-- 这个是隐式规则自动推导的
g++ demo.o -o main
wohu@ubuntu:~/cpp/func$ 

Supongo que te gusta

Origin blog.csdn.net/wohu1104/article/details/110942995
Recomendado
Clasificación