Cómo compilar SQLite-Cómo compilar SQLite
SQLite es el código fuente de ANSI-C. Debe compilarse en código de máquina antes de su uso. Este artículo es una guía para varios métodos de compilación de SQLite.
Este artículo no incluye comentarios sobre cada paso de la compilación de SQLite, lo que puede resultar difícil porque cada escenario de desarrollo es diferente. Entonces, este artículo describe y desarrolla los principios de compilación de Sqlite. Se han proporcionado comandos de compilación típicos como ejemplos con la esperanza de que los desarrolladores de aplicaciones puedan utilizar estos ejemplos como guía para completar sus propios procesos de compilación personalizados. En otras palabras, este artículo proporciona ideas y conocimientos, no una solución llave en mano.
Archivos fuente separados de Fusion VS
Sqlite se construye a partir de más de cien archivos fuente C y scripts en numerosos directorios. La implementación de SQLite es ANSI-C pura, pero muchos archivos de código fuente en lenguaje C se generan o convierten a partir de programas auxiliares de C, y los scripts AWK, SED y TCL se fusionan en la biblioteca SQLite completa. Crear los programas C necesarios para Sqlite y convertir y crear el código fuente en lenguaje C es un proceso complejo.
Para simplificar esto, sqlite también utiliza un archivo de código fuente combinado preempaquetado: sqlite3.c. Este archivo combinado es el único archivo que implementa toda la biblioteca SQLite en código fuente ANSI-C. Es más fácil trabajar con los archivos combinados. Todo está contenido en este único archivo, por lo que es fácil ingresar a un árbol fuente de programa C o C más grande. Se han implementado todos los pasos de generación y transformación de código, por lo que no hay programas C auxiliares que configurar y modificar, ni scripts que ejecutar. Y, como todo está contenido en una unidad de traducción, el compilador puede realizar optimizaciones más avanzadas para mejorar el rendimiento entre 5 y 10. Por estos motivos, se recomienda el archivo de código fuente fusionado sqlite3.c para todos los programas.
Se recomienda que todas las aplicaciones utilicen archivos fusion.
Ciertamente es posible compilar SQLite directamente a partir de archivos fuente separados, pero no se recomienda. Para algunas aplicaciones especiales, puede ser necesario modificar el programa de compilación para manejar situaciones que no se pueden lograr utilizando archivos fuente prediseñados descargados del sitio web. Para estos casos, se recomienda crear y utilizar un archivo de combinación personalizado. En otras palabras, incluso si un proyecto requiere compilar SQLite a partir de archivos fuente separados, se recomienda utilizar un archivo fuente combinado como paso intermedio.
Compilar la interfaz de línea de comandos (CLI)
La creación de la interfaz de línea de comandos requiere tres archivos de código fuente:
sqlite3.c: archivo de código fuente de Sqlite fusion p >
sqlite3.h: coincide con sqlite3.c y el archivo de encabezado que define la interfaz del lenguaje C de sqlite
shell.c: el programa de interfaz de línea de comando en sí. Este archivo de código fuente c contiene una rutina main() y una solicitud de entrada del usuario en cada ciclo y pasa la entrada al motor de base de datos sqlite para su procesamiento.
Los tres archivos de código fuente anteriores se incluyen en el tarball combinado en la página de descarga.
Para construir la CLI, simplemente coloque estos tres archivos en el mismo directorio y compílelos juntos. Utilice MSVC:
cl shell.c sqlite3.c -Fesqlite3.exe
En un sistema Unix (o use cygwin o mingw msys en Windows), un comando típico sería algo como este :
gcc shell.c sqlite3.c -lpthread -ldl
Para la seguridad de subprocesos SQLite, se requiere la biblioteca pthreads.
Pero como la CLI es de un solo subproceso, podemos indicarle a SQLite que cree una biblioteca que no sea segura para subprocesos y, por lo tanto, proteja la biblioteca pthreads:
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl
La biblioteca -ldl es necesaria para admitir la carga dinámica, como la interfaz sqlite3_load_extension() y la función SQL load_extension()
. Si no se requiere ninguna de estas características, también podemos ignorarlas usando la opción de tiempo de compilación SQLITE_OMIT_LOAD_EXTENSION.
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c
Es posible que alguien desee proporcionar otras opciones en tiempo de compilación (opciones en tiempo de compilación), como SQLITE_ENABLE_FTS3 para el texto completo buscar O SQLITE_ENABLE_RTREE para extensiones de motor de búsqueda de árbol R*. Y normalmente alguien especificará algunos modificadores de optimización de compilación. (La CLI precompilada se puede descargar desde el sitio web selecto de sqlite usando "-Os") Aquí hay innumerables variables posibles.
El punto clave está aquí: construir la CLI requiere compilar dos archivos en lenguaje C juntos. El archivo shell.c contiene la definición de la entrada y el bucle de entrada del usuario, mientras que el archivo sqlite fusion sqlite3.c contiene la implementación de la biblioteca sqlite completa.
Compilar la interfaz TCL
La interfaz tcl de sqlite es un pequeño módulo que se agrega al archivo de fusión general. El resultado es un nuevo archivo fuente combinado llamado "tclsqlite3.c". Este archivo de código fuente es necesario para generar una biblioteca compartida que se puede cargar en un tclsh estándar o se puede usar el comando load de TCL, o se puede generar exitosamente un tclsh separado y único con la compilación sqlite. Se incluye una copia fusionada de tcl como archivo en el tarball de TEA en la página de descarga.
Para generar una biblioteca cargable por TCL para sqlite en Linux, se deben cumplir los siguientes comandos:
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread - ldl -ltcl
Desafortunadamente, crear bibliotecas compartidas para Mac OS X y Windows no es tan sencillo. Para estas plataformas, es mejor usar el script de configuración y el archivo MAKE incluidos en el tarball de TEA.
Para generar un tclsh separado que pueda usarse para enlaces estáticos con sqlite, use la siguiente llamada del compilador:
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm
El truco aquí es la opción -DTCLSH=1. El módulo de interfaz TCL de sqlite contiene un proceso principal, que se utiliza para inicializar un intérprete TCL e ingresar a un bucle de línea de comando después de compilar con -DTCLSH=1. El comando anterior funcionará en Linux y Mac
OS X, aunque a veces puede ser necesario ajustar las opciones de la biblioteca según la plataforma y la versión de TCL que se compiló.
Creación del archivo fusion
La versión del archivo sqlite fusion proporcionada en la página de descarga es suficiente para la mayoría de los usuarios. Sin embargo, es posible que algunos proyectos quieran o necesiten crear sus propios archivos de fusión.
Una razón común para crear un archivo de fusión personalizado es personalizar la biblioteca SQLite con opciones específicas en tiempo de compilación. Recuerde que el archivo sqlite fusion contiene una gran cantidad de código C generado por programas y scripts auxiliares. Varias opciones en tiempo de compilación afectan este código santificado y deben proporcionarse al generador de código antes de ensamblar el archivo de fusión. El conjunto de opciones en tiempo de compilación que se deben pasar al generador de código variará entre las versiones de SQLite, pero al momento de escribir este artículo, el conjunto de opciones que el generador de código necesita conocer incluye:
SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
>SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE
Para crear un archivo de fusión personalizado, primero descargue el código fuente independiente original archivos a una plataforma de desarrollo Unix o similar a Unix. Asegúrese de que el archivo de código fuente original obtenido no sea un "archivo fuente precompilado". Cualquiera puede obtener un conjunto completo de archivos de código fuente originales yendo a la página de descarga o directamente desde el sistema de gestión de configuración.
Supongamos que el árbol fuente de sqlite está almacenado en un directorio llamado "sqlite". Planee crear un archivo de fusión llamado "bld" en un directorio paralelo. Primero, cree un archivo MAKE adecuado ejecutando el script de configuración del árbol fuente sqlite o haciendo una copia de la plantilla makfile en la parte superior del árbol fuente. Luego edite manualmente el archivo Makfile para incluir las opciones necesarias relacionadas con el tiempo de compilación. Ejecución final:
make sqlite3.c
Usando MSVC en Windows:
nmake /f Makefile.msc sqlite3.c
make target de sqlite3.c construirá automáticamente el archivo de código fuente combinado "sqlite3.c" general, su archivo de encabezado "sqlite3.h" y el archivo de código fuente combinado "tclsqlite3. c". Luego, los archivos requeridos se pueden copiar al directorio de archivos y compilar de acuerdo con el proceso descrito anteriormente.
Construya una biblioteca DLL de vínculos dinámicos de Windows
Para crear una DLL SQLite en Windows, primero obtenga los archivos de código fuente fusionados correspondientes, sqlit3.c y sqlite.h. Estos se pueden descargar del sitio web de SQLite o generarse de forma personalizada como se mencionó anteriormente.
Usando el archivo de código fuente en el directorio de trabajo, se puede generar una dll en msvc usando el siguiente comando:
cl sqlite3.c -link -dll -out:sqlite3.dll
El comando anterior requiere que el comando MSVC Native Tools se ejecute en el símbolo del sistema msvc
Si tiene msvc instalado en su máquina, es posible que tenga varias versiones de este símbolo del sistema para x86. Construido con x64 o compilado de forma cruzada con ARM. Dependiendo de la DLL requerida, use la herramienta de símbolo del sistema adecuada.
Si usas el compilador MinGW, el comando es así:
gcc -shared sqlite3.c -o sqlite3.dll
Ten en cuenta que MinGW solo genera DLL de 32 bits. También hay un proyecto MinGW64 independiente que se puede utilizar para generar archivos DLL de 64 bits. Se puede inferir que la sintaxis de la línea de comando es similar. Cabe señalar que es posible que las DLL generadas por versiones recientes de MSVC no funcionen en WinXP o versiones anteriores de Windows. Por lo tanto, para maximizar la compatibilidad con su dll generado, se recomienda MinGW. Una buena regla general es utilizar MinGW para generar archivos DLL de 32 bits y msvc para generar archivos DLL de 64 bits.