Как скомпилировать SQLite
Содержание
Обзор
SQLite написан на языке ANSI-C. Он должен быть скомпилирован в машинный код, прежде чем станет полезным. Эта статья является руководством по различным способам компиляции SQLite.
Эта статья не содержит пошагового рецепта компиляции SQLite. Это было бы сложно, так как каждая ситуация разработки отличается. Вместо этого эта статья описывает и иллюстрирует принципы компиляции SQLite. Типичные команды компиляции приведены в качестве примеров с ожиданием, что разработчики приложений смогут использовать эти примеры в качестве руководства для разработки собственных процедур компиляции. Другими словами, эта статья предоставляет идеи и идеи, а не готовые решения.
1. Объединение против отдельных файлов исходного кода
SQLite состоит из более чем ста файлов кода C и скриптов, распределённых по нескольким каталогам. Реализация SQLite основана на чистом ANSI-C, но многие файлы исходного кода языка C либо генерируются, либо преобразуются вспомогательными программами C и скриптами AWK, SED и TCL перед включением в готовый библиотеку SQLite. Построение необходимых программ C и преобразование и/или создание исходного кода языка C для SQLite – сложный процесс.
Для упрощения, SQLite также доступен в виде предварительно упакованного файла исходного кода объединения: sqlite3.c. Объединение – это единственный файл кода ANSI-C, реализующий всю библиотеку SQLite. С объединением работать гораздо проще. Всё содержится в одном файле кода, поэтому его легко добавить в структуру исходного кода более крупной программы на C или C++. Все этапы генерации и преобразования кода уже выполнены, поэтому нет необходимости конфигурировать и компилировать вспомогательные программы C и запускать скрипты. Кроме того, так как вся библиотека содержится в одном трансляционном блоке, компиляторы могут выполнять более продвинутые оптимизации, что приводит к улучшению производительности на 5–10%. По этим причинам файл исходного кода объединения («sqlite3.c») рекомендуется для всех приложений.
Использование объединения рекомендуется для всех приложений.
Компиляция SQLite непосредственно из отдельных файлов исходного кода, безусловно, возможна, но не рекомендуется. В некоторых специализированных приложениях может потребоваться изменить процесс сборки способами, которые невозможно сделать только с использованием предварительно созданного файла объединения, загруженного с веб-сайта. В таких ситуациях рекомендуется создать настраиваемое объединение (как описано ниже) и использовать его. Другими словами, даже если проекту требуется компиляция SQLite, начиная с отдельных исходных файлов, всё же рекомендуется использовать файл исходного кода объединения как промежуточный шаг.
2. Компиляция командной строки
Для сборки интерфейса командной строки требуются три файла исходного кода:
- sqlite3.c: Файл исходного кода объединения SQLite
- sqlite3.h: Файлы заголовков, которые сопровождают sqlite3.c и определяют интерфейсы языка C для SQLite.
- shell.c: Программа командной строки. Это файл исходного кода C, содержащий определение процедуры main() и цикла, который запрашивает пользовательский ввод и передает его в движок базы данных SQLite для обработки.
Все три вышеперечисленных файла исходного кода находятся в архиве объединения, доступном на странице загрузки.
Для сборки интерфейса командной строки просто поместите эти три файла в одну директорию и скомпилируйте их вместе. Используя MSVC:
cl shell.c sqlite3.c -Fesqlite3.exe
В системах Unix (или в Windows с использованием cygwin или mingw+msys) команда обычно выглядит следующим образом:
gcc shell.c sqlite3.c -lpthread -ldl -lm -o sqlite3
Библиотека pthreads необходима для обеспечения потокобезопасности SQLite. Но поскольку интерфейс командной строки является однопоточным, мы можем указать SQLite на сборку в режиме без обеспечения потокобезопасности, тем самым исключив библиотеку pthreads:
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -lm -o sqlite3
Библиотека -ldl необходима для поддержки динамической загрузки, интерфейса sqlite3_load_extension() и SQL-функции load_extension(). Если эти функции не требуются, их можно исключить, используя параметр времени компиляции SQLITE_OMIT_LOAD_EXTENSION:
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3
Возможно, потребуется указать другие параметры времени компиляции, такие как
- -DSQLITE_ENABLE_FTS4 или -DSQLITE_ENABLE_FTS5 для полнотекстового поиска,
- -DSQLITE_ENABLE_RTREE для расширения механизма поиска R*Tree,
- -DSQLITE_ENABLE_DBSTAT_VTAB для виртуальной таблицы dbstat, или
- -DSQLITE_ENABLE_MATH_FUNCTIONS для расширенных математических функций.
Для отображения дополнительных комментариев в результатах EXPLAIN добавьте параметр -DSQLITE_ENABLE_EXPLAIN_COMMENTS. Добавьте -DHAVE_READLINE и библиотеки -lreadline и -lncurses, чтобы получить поддержку редактирования командной строки. Возможно, также потребуется указать некоторые параметры оптимизации компилятора. (Предварительно скомпилированный интерфейс командной строки, доступный для загрузки с веб-сайта SQLite, использует "-Os".) Здесь существует бесчисленное множество возможных вариантов. Команда для компиляции полнофункциональной оболочки может выглядеть примерно так:
gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 \ -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS \ -DHAVE_READLINE \ shell.c sqlite3.c -ldl -lm -lreadline -lncurses -o sqlite3
Главная идея заключается в следующем: сборка CLI состоит из компиляции двух файлов кода языка C. Файл shell.c содержит определение точки входа и цикла ввода пользователя, а файл объединения SQLite sqlite3.c содержит полную реализацию библиотеки SQLite.
3. Компиляция TCL-интерфейса
TCL-интерфейс для SQLite – это небольшой модуль, добавляемый в обычное объединение. Результатом является новый объединённый файл исходного кода под названием «tclsqlite3.c». Этот единственный исходный файл необходим для генерации разделяемой библиотеки, которую можно загрузить в стандартный tclsh или wish с помощью команды загрузки TCL, или для создания автономного tclsh с встроенным SQLite. Копия объединения TCL включена на странице загрузки как файл в архиве TEA.
Для создания загружаемой TCL-библиотеки для SQLite в Linux следующая команда будет достаточной:
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl
Создание разделяемых библиотек для Mac OS X и Windows, к сожалению, не так просто. Для этих платформ лучше всего использовать скрипт конфигурации и Makefile, который включён в архиве TEA.
Для создания автономного tclsh, статически связанного с SQLite, используйте этот вызов компилятора:
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm
Секрет здесь заключается в параметре -DTCLSH=1. Модуль TCL-интерфейса для SQLite включает процедуру main(), которая инициализирует интерпретатор TCL и входит в цикл командной строки при компиляции с параметром -DTCLSH=1. Приведённая выше команда работает как в Linux, так и в Mac OS X, хотя возможно потребуется внести коррективы в параметры библиотек в зависимости от платформы и используемой версии TCL.
4. Построение объединения
Версии объединения SQLite, предоставляемые на странице загрузки, как правило, подходят большинству пользователей. Однако некоторым проектам может потребоваться или захотеться создать собственные объединения. Частая причина создания настраиваемого объединения – использование определённых параметров времени компиляции для настройки библиотеки SQLite. Обратите внимание, что объединение SQLite содержит много кода C, который генерируется вспомогательными программами и скриптами. Многие параметры времени компиляции влияют на этот сгенерированный код и должны быть предоставлены генераторам кода перед сборкой объединения. Набор параметров времени компиляции, которые должны быть переданы генераторам кода, может меняться от одной версии SQLite к другой, но на момент написания (примерно SQLite 3.6.20, 2009-11-04) набор параметров, которые должны быть известны генераторам кода, включает:
- 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
Для создания настраиваемого объединения сначала загрузите исходные файлы в Unix-подобную среду разработки. Убедитесь, что вы загружаете оригинальные исходные файлы, а не «предварительно обработанные исходные файлы». Полный набор оригинальных исходных файлов можно получить либо со страницы загрузки, либо напрямую из системы управления версиями.
Предположим, что дерево исходных кодов SQLite хранится в каталоге под названием «sqlite». Планируется создать объединение в параллельном каталоге (например, «bld»). Сначала создайте соответствующий Makefile, либо запустив скрипт конфигурации в корне дерева исходных кодов SQLite, либо скопировав один из шаблонных Makefiles в корне дерева исходных кодов. Затем вручную отредактируйте этот Makefile, чтобы включить необходимые параметры времени компиляции. Наконец, выполните:
make sqlite3.c
Или в Windows с использованием MSVC:
nmake /f Makefile.msc sqlite3.c
Целевое задание «sqlite3.c» автоматически сгенерирует обычный файл объединения «sqlite3.c», его заголовочный файл «sqlite3.h» и файл объединения «tclsqlite3.c», включающий интерфейс TCL. После этого необходимые файлы можно скопировать в каталоги проекта и скомпилировать в соответствии с описанными выше процедурами.
5. Создание DLL для Windows
Для создания DLL SQLite для использования в Windows необходимо сначала получить соответствующие файлы объединенного исходного кода, sqlite3.c и sqlite3.h. Их можно загрузить с веб-сайта SQLite или сгенерировать на основе исходного кода, как показано выше.
При наличии файлов исходного кода в рабочей директории DLL можно сгенерировать с помощью MSVC с помощью следующей команды:
cl sqlite3.c -link -dll -out:sqlite3.dll
Вышеприведенная команда должна быть выполнена из командной строки MSVC Native Tools. Если у вас установлена MSVC на компьютере, у вас, вероятно, есть несколько версий этой командной строки для нативных сборок x86 и x64, а также, возможно, для кросс-компиляции в ARM. Используйте соответствующую командную строку в зависимости от требуемой DLL.
Если используется компилятор MinGW, команда имеет следующий вид:
gcc -shared sqlite3.c -o sqlite3.dll
Обратите внимание, что MinGW генерирует только 32-битные DLL. Существует отдельный проект MinGW64, который можно использовать для генерации 64-битных DLL. Вероятно, синтаксис командной строки аналогичен. Также обратите внимание, что последние версии MSVC генерируют DLL, которые не будут работать на WinXP и более ранних версиях Windows. Поэтому для максимальной совместимости создаваемой DLL рекомендуется использовать MinGW. Хорошим правилом является генерация 32-битных DLL с помощью MinGW и 64-битных DLL с помощью MSVC.
В большинстве случаев вам необходимо дополнить основные команды выше приведенными вариантами компиляции, соответствующими вашему приложению. Часто используемые варианты компиляции включают:
-
-Os - Оптимизация по размеру. Сделайте DLL как можно меньше.
-
-O2 - Оптимизация по скорости. Это сделает DLL больше, развернув циклы и встроив функции.
-DSQLITE_ENABLE_FTS4 - Включить код движка полнотекстового поиска FTS4 в SQLite.
-DSQLITE_ENABLE_RTREE - Включить расширение R-Tree.
-DSQLITE_ENABLE_COLUMN_METADATA - Включает дополнительные API, необходимые некоторым распространенным системам, включая Ruby-on-Rails.
Эта страница была изменена в последний раз 01.11.2024 11:21:37 UTC
SQLite is in the Public Domain.
https://sqlite.org/howtocompile.html