3.5 KiB
title | date | draft | tags | ||
---|---|---|---|---|---|
🪵 Компиляция cтатических бинарников с помощью TinyCC | 2023-07-30T13:52:57+03:00 | false |
|
Введение
Нерушимой истинной является факт,
что для 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
.