¿Cuál es la diferencia entre "include_lib" e "include"?Erlang: ¿cuál es la diferencia entre "include_lib" e "include"?
E.g.
-include_lib("eunit/include/eunit.hrl")
¿Cuál es la diferencia entre "include_lib" e "include"?Erlang: ¿cuál es la diferencia entre "include_lib" e "include"?
E.g.
-include_lib("eunit/include/eunit.hrl")
La forma en que la documentación describe the difference between include and include_lib es:
include_lib
es similar ainclude
, pero no debe señalar un archivo absoluta. 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ódigo utiliza código: lib_dir (kernel) para encontrar el directorio de la versión actual (última) del kernel, y luego el subdirectorio include se busca en el archivo archivo .hrl.
Así que en su ejemplo, ya no tienes que señalar la versión de eunit que incluya, se está incluyendo la última eunit.hrl del eunit: s que existe en su ruta de bibliotecas.
Una diferencia que no es obvia al principio es que -include
y -include_lib
utilizan un conjunto diferente de rutas al buscar archivos de encabezado. -include_lib
de hecho utiliza la ruta del código, no la ruta del archivo de encabezado.
Por lo tanto, la bandera erlc
espera agregar una ruta a la ruta de búsqueda -include
es -I
; la bandera para -include_lib
es -pa
/-pz
.
Ya se mencionó el hecho de que usar -include_lib
nos ahorra especificar (y por lo tanto vincular) el módulo a una versión de biblioteca específica.
Además, hay una convención que cabezales internos se almacenan dentro de la src/
subdirectorio de un proyecto y incluyeron usando -include
. Encabezados externos (destinados a ser utilizados por otras bibliotecas/proyectos) los archivos se almacenan en include/
y se incluyen usando -include_lib
.
Creo que también puede usar include_lib para incluir archivos que desee desde una versión específica de una aplicación instalada. –