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 Makefile
el archivo no están en la misma ruta), en el momento de la compilación, utilice una Makefile
bú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;vpath
Es 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 Makefile
puede escribir:
VPATH := dir
Podemos entender el dir
valor de asignación a la variable VPATH
, por lo que el make
tiempo de ejecución será desde el dir
directorio 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 dir
el directorio de archivos y luego buscar dir2
archivos en un directorio.
Nota: No importa cuántas rutas se definan,
make
cuando se ejecute primero buscará archivos en el directorio actual, no hay archivo que estemos buscando para el directorio actual, solo vaya aVPATH
la ruta para buscar. Si queremos usar el archivo en el directorio actual,make
usará 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$
Makefile
En header
y source
catalogar el mismo directorio. Escrito Makefile
como sigue:
main: main.o name.o
g++ main.o name.o -o main
Se make
dará ejecución :
make: *** No rule to make target 'main.o', needed by 'main'. Stop.
El objetivo final es reconstruir el archivo main
cuando necesitamos main.o
archivar, pero no encontramos main.o
el 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 dir
bú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 VPATH
son similares con un espacio o dos puntos separados, es el primer orden de la ruta de búsqueda del dir
directorio, luego el dir2
directorio.
Seguido por el uso dos, el formato del comando es el siguiente:
vpath main.cpp
El uso de Two significa borrar main.cpp
directorios 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 vpath
tiempo, 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 %.cpp
indicar que todos los .cpp
archivos 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 VPATH
casos 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 VPATH
la mejor manera.
Si hay un archivo especial de múltiples rutas o puede usar comodines cuando se indique, no se recomienda usar VPATH
este método, ¿por qué?
Debido VPATH
a 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 vpath
bú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 makefile
es 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/vpath
informar la ruta de búsqueda de archivos se informa quemake
esto es propicio para la búsqueda de archivos cuando se deduce implícitamente, no se informagcc
, todavía tienen que pasar-I
especificadogcc
cuando la ruta de búsqueda de archivos de encabezado precompilado.
2.1 Reglas implícitas para variables de comando
La escritura Makefile
se puede escribir directamente shell
con 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 CXXFLAGS
un 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$