УНИТе

Портал > Документация > Компилиране, инсталиране и използване на SQLite3 под CentOS 7 и 8

Компилиране, инсталиране и използване на SQLite3 под CentOS 7 и 8

Съдържание:

  1. Предварителна информация
  2. Изтегляне на изходния код и компилирането му с Intel Compilers
  3. Използване на компилираната библиотека в Python 3
  4. Динамично и статично свързване на компилираната библиотека към C/C++ приложения

 

1. Предварителна информация

SQLite3 е SQL библиотека, която може да бъде интегрирана в широк набор приложения. Поддържа "in-memory" бази данни или такива, запазени като файл, в специфичен бинарен формат (не поддържа мрежово достъпен сървър от типа на PostgreSQL или MySQL). SQLite3 е най-използваната SQL библиотека в приложения и системен софтуер и работи под всички модерни операционни системи.

Целта на този документ е да покаже как да бъде компилирана, инсталирана и използвана версия на SQLite3 библиотеката, с използване на Intel Compilers, за постигане на висока произовдителност. Трябва да се отчете, че по-висока производителност (в сравнение с кода на библиотеката, компилирана с GCC компилатор) може да се очаква само за някои SQL операции, като тези свързани с аритметични операции.

За момента не се препоръчва библиотеката да се компилира с PGI Compilers, тъй като продукта на тази компилация не превъзхожда по скорост този, който е създаден чрез Intel Compilers или GNU Compilers.

 

2. Изтегляне на изходния код и компилирането му с Intel Compilers

Инсталирайте следните системни пакети, които са нужни за да може SQLite3 библиотеката да използва компресия (през zlib) и за да може инструмента sqlite3 да има история на командите, изпълнени чрез неговия команден интерпретатор (през readline):

  • CentOS 7:

    $ sudo yum install zlib-devel readline-devel
  • CentOS 8:

    $ sudo dnf install zlib-devel readline-devel

Изтеглете програмния код на последната актуална версия на SQLite от страницата на проекта:

https://sqlite.org/download.html

На тази страница ще видите секция "Source code", в която има два варианта на архива с програмния код - "amalgamation" и "autoconf". Това, което ви е нужно е "autoconf" варианта на архива с програмния код. Имайте предвид и номерацията на версията в името на архивите. Например, "330010" означава версия 3.30.1, За примерите по-долу, се предполага, че версията на кода е "330010". В този случай, може да изтеглите архива с програмния код чрез wget:

$ mkdir ~/build
$ cd ~/build
$ wget https://sqlite.org/2019/sqlite-autoconf-3300100.tar.gz

Разпакетирайте кода и влезте в директорията, която ще се създаде след разпакетирането:

$ cd ~/build
$ tar xvf sqlite-autoconf-3300100.tar.gz
$ cd sqlite-autoconf-3300100

Използвайте icc компилатора (част от инсталацията на Intel Compilers) за да компилирате кода и след това го инсталирайте:

$ CC=icc CFLAGS="-xHost -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_DISABLE_DIRSYNC=1 -DSQLITE_ENABLE_FTS3=3 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_SECURE_DELETE=1 -DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_JSON1=1 -Wall -fno-strict-aliasing" ./configure --prefix=/home/vesso/unite/sqlite-3.30.1-icc --enable-fts5 --enable-threadsafe --enable-dynamic-extensions --enable-readline --enable-session
$ make
$ make install

Отбележете, че във вашия случай, вие може да използвате друга директория за инсталацията и не е нужно задължиелно да имате върху файловата система /usr/inite/sqlite-3.30.0-icc.

След успешно завършване на инсталацията, може да изведете списък с библиотеките, към които е динамично свързана библиотеката libsqlite3.so. Това става по следния начин (с указване на пълния път до файла на библиотеката):

$ ldd /usr/unite/sqlite-3.30.1-icc/lib/libsqlite3.so

Трябва да получите изход, който е подобен на (записите в него може да варират, в зависимост от версията на Intel Compilers и CentOS дистрибуцията):

   linux-vdso.so.1 =>  (0x00007ffd9efb0000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f966d442000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f966d226000)
	libimf.so =>  /usr/unite/intel/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64/libimf.so (0x00007f966cc93000)
	libsvml.so =>  /usr/unite/intel/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64/libsvml.so (0x00007f966b385000)
	libirng.so =>  /usr/unite/intel/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64/libirng.so (0x00007f966b011000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f966ad0f000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f966aaf9000)
	libintlc.so.5 =>  /usr/unite/intel/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64/libintlc.so.5 (0x00007f966a88b000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f966a4bd000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f966a2b9000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f966dab1000)

Най-важното, за което трябва да проверите в този списък с библиотеки, е наличието на свързани библиотеки от колекцията на Intel Compilers (като libimf.so, libsvml.so, libirng.so и libintlc.so.5). Трябва да виждате пълния път до файловете им, както е показано по-горе.

 

3. Използване на компилираната библиотека в Python 3

За да може Python3 (3.4 и по-висока версия) да използва така компилираната библиотека libsqlite3.so, версията на Python трябва да е компилирана с поддръжка на SQLite3 (което е вярно за всички версии на Python от пакетните хранилища на CentOS 7 и 8) и преди стартирането на Python интерпретатора да се промени стойността на променливата на средата LD_LIBRARY_PATH по начин, който включва пътя до директорията с новата библиотека:

$ export LD_LIBRARY_PATH=/usr/unite/sqlite-3.30.1-icc/lib:$LD_LIBRARY_PATH

За да проверите, че компилираната библиотека на SQLite3 е наистина достъпна за Python3 изпълнете:

$ LD_LIBRARY_PATH=/usr/unite/sqlite-3.30.1-icc/lib:$LD_LIBRARY_PATH python3 -c "import sqlite3; print(sqlite3.sqlite_version)"

Ако зареждането на библиотеката е успешно, ще получите числото на конкретната версия, която сте компилирали при вас (тук за примера е версия 3.30.1):

3.30.1

 

4. Динамично и статично свързване на компилираната библиотека към C/C++ приложения

За да може даден код да бъде компилиран спрямо динамичната версия на SQLite3 библиотеката, освен описание на използваните от нея функции в кода, в процеса на компилацията му трябва да бъдат посочени пътищата до хедър файловете и библиотеката:

$ ./configure ... CGLAGS="-I/usr/unite/sqlite-3.30.1-icc/include" LFLAGS="-L/usr/unite/sqlite-3.30.1-icc/lib"

или

$ make ... CGLAGS="-I/usr/unite/sqlite-3.30.1-icc/include" LFLAGS="-L/usr/unite/sqlite-3.30.1-icc/lib"

След успешна компилация спрямо динамичната версия на библиотеката, изпълнимият код трябва да може да зарежда libsqlite3.so при стартиране. За целта, в текущата сесия на bash, в която ще става стартирането, трябва да се зареди пътя до libsqlite3.so:

$ export LD_LIBRARY_PATH=/usr/unite/sqlite-3.30.1-icc/lib:$LD_LIBRARY_PATH

Това зареждане може да бъде направено инцидентно (примера по-горе) или да стане част от постоянните настройки за Bash сесията (те са обикновено във файла ~/.bashrc).

ВАЖНО! В системата, в която ще се изпълнява кода на приложението, към което е динамично свързана библиотеката libsqlite3.so, трябва да са налични и съответните библиотеки от пакета Intel Compilers (виж примера с извеждането на техния списък по-горе).

Когато се използва статичната версия на SQLite3 библиотеката, самия файл с библиотеката се задава в списъка с бинарни обекти, на база на които компилатора създава изпълнимия код. Например:

$ icc -o test test.c file1.o file2.o /usr/unite/sqlite-3.30.1-icc/lib/libsqlite3.a

 


Последна актуализация: 12 октомври 2019

2019 УНИТе, Веселин Колев