Blog/content/posts/2023/c/tcc-build-static-executable.md
2023-07-30 15:12:16 +03:00

3.5 KiB
Raw Permalink Blame History

title date draft tags
🪵 Компиляция cтатических бинарников с помощью TinyCC 2023-07-30T13:52:57+03:00 false
c
tips

Введение

Нерушимой истинной является факт, что для 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.

Ресурсы