telecomunicaciones - erlang tutorial
Erlang: ¿cuál es la diferencia entre "include_lib" y "include"? (2)
¿Cuál es la diferencia entre "include_lib" e "include"?
P.ej
-include_lib("eunit/include/eunit.hrl")
La forma en que la documentación describe la diferencia entre include y include_lib es:
include_lib
es similar ainclude
, pero no debe señalar un archivo absoluto. En cambio, se asume que el primer componente de camino (posiblemente después de la sustitución de la variable) es el nombre de una aplicación.Ejemplo:
-include_lib("kernel/include/file.hrl").
El servidor de códigos usa el código: lib_dir (kernel) para encontrar el directorio de la versión actual (más reciente) de Kernel, y luego se incluye el subdirectorio para buscar el archivo file.hrl.
Por lo tanto, en su ejemplo, no necesita indicar la versión de eunit que incluye, está incluyendo la última eunit.hrl de la unidad que existe en la ruta de su biblioteca.
Una diferencia que no es obvia al principio es que -include
y -include_lib
usan un conjunto diferente de rutas al buscar archivos de encabezado. -include_lib
de hecho usa la ruta del código, no la ruta del archivo del encabezado.
Por lo tanto, el indicador erlc
espera agregar una ruta a la -include
búsqueda -include
es -I
; la bandera para -include_lib
es -pa
/ -pz
.
Ya se mencionó el hecho de que el uso de -include_lib
nos evita especificar (y por lo tanto vincular) el módulo a una versión de biblioteca específica.
Además, existe una convención de que los encabezados internos se almacenan dentro del subdirectorio src/
de un proyecto y se incluyen mediante -include
. Los archivos de encabezados externos (destinados a ser utilizados por otras bibliotecas / proyectos) se almacenan en include/
y se incluyen usando -include_lib
.