Введение
Нерушимой истинной является факт, что для cтатической компиляции компилятору необходимо добавить флаг -static
и указать необходимые библиотеки через параметр -l
, список которых отличается от динамической компиляции.
Однако для tcc это не работает.
Компиляция cтатических исполныемых файлов
На примере библиотеки SQLite3 покажу как компилировать статическую программу.
Для получения списка библиотек воспользуемся инструментом pkg-config.
$ pkg-config --libs sqlite3
-lsqlite3
Для статической компиляции список библиотек будет немного больше.
$ pkg-config --libs --static sqlite3
-lsqlite3 -lm -lz
В итоге получается, что для GCC/Clang команда компиляции будет выглядеть следующим образом.
gcc -static -Wall -O3 -o ${file%.*} $file `pkg-config --libs --static sqlite3`
Мне казалось очевидным, что для TCC дела обстоят таким же образом, однако не тут то было.
-static в TCC
На страницы документации к TCC (https://bellard.org/tcc/tcc-doc.html) указана опция -static
.
-static
Generate a statically linked executable (default is a shared linked executable).
Запустив tcc
с параметром -hh
, который выводит расширенную справку, можно заметить, что в описании к параметру -static
написано не рекомендуется к использованию.
-static link to static libraries (not recommended)
В моём случае при компиляции прогаммы с параметром -static
компилятор возвращает ошибку сегментации.
Статическая компилция в TCC
Чтобы скомпилировать в tcc программу статически, необходимо напрямую передать компилятору *.a
файлы.
tcc -Wall -O3 -o ${file%.*} -I$C_INCLUDE_PATH $file $LIBRARY_PATH/libname.a
Дополнительно
Хочу упомянуть, что tcc не поддерживает переменные окружения C_INCLUDE_PATH
или CPATH
и LIBRARY_PATH
, с помощью которых можно задать пути для заголовочных файлов и файлов библиотек.
Для tcc необходимо задавать каталоги стандартным способом, через параметры -I
и -L
.