Compare commits

...

3 Commits

Author SHA1 Message Date
Alexander Popov 2c260208b1
Merge branch 'master' of git.a2s.su:iiiypuk/Blog 2023-08-19 23:49:36 +03:00
Alexander Popov f8db8abd00
convert pdf to png 2023-08-19 23:47:19 +03:00
Alexander Popov 4736da09ec
tcc static build 2023-07-30 15:12:16 +03:00
2 changed files with 115 additions and 0 deletions

View File

@ -0,0 +1,88 @@
---
title: "🪵 Компиляция cтатических бинарников с помощью TinyCC"
date: 2023-07-30T13:52:57+03:00
draft: false
tags: [c, tips]
---
## Введение
Нерушимой истинной является факт,
что для cтатической компиляции компилятору необходимо добавить флаг `-static`
и указать необходимые библиотеки через параметр `-l`,
список которых отличается от динамической компиляции.
Однако для **tcc** это не работает.
## Компиляция cтатических исполныемых файлов
На примере библиотеки **SQLite3** покажу как компилировать статическую программу.
Для получения списка библиотек воспользуемся инструментом **pkg-config**.
```text
$ pkg-config --libs sqlite3
-lsqlite3
```
Для статической компиляции список библиотек будет немного больше.
```text
$ pkg-config --libs --static sqlite3
-lsqlite3 -lm -lz
```
В итоге получается, что для GCC/Clang команда компиляции будет выглядеть следующим образом.
```sh
gcc -static -Wall -O3 -o ${file%.*} $file `pkg-config --libs --static sqlite3`
```
Мне казалось очевидным, что для TCC дела обстоят таким же образом,
однако не тут то было.
## -static в TCC
На страницы документации к **TCC** (https://bellard.org/tcc/tcc-doc.html)
указана опция `-static`.
Цитата из документации:
```text
-static
Generate a statically linked executable (default is a shared linked executable).
```
Запустив `tcc` с параметром `-hh`, который выводит расширенную справку,
можно заметить, что в описании к параметру `-static`
написано **не рекомендуется к использованию**.
Цитата из справки:
```text
-static link to static libraries (not recommended)
```
В моём случае при компиляции прогаммы с параметром `-static` компилятор возвращает
ошибку сегментации.
## Статическая компилция в TCC
Чтобы скомпилировать в **tcc** программу статически,
необходимо напрямую передать компилятору `*.a` файлы.
```sh
tcc -Wall -O3 -o ${file%.*} -I$C_INCLUDE_PATH $file $LIBRARY_PATH/libname.a
```
## Дополнительно
Хочу упомянуть, что **tcc** не поддерживает переменные окружения
`C_INCLUDE_PATH` или `CPATH` и `LIBRARY_PATH`,
с помощью которых можно задать пути для заголовочных файлов и файлов библиотек.
Для **tcc** необходимо задавать каталоги стандартным способом, через параметры `-I` и `-L`.
## Ресурсы
* [Re: [Tinycc-devel] Is static linking functional?](https://mail.gnu.org/archive/html/tinycc-devel/2014-06/msg00028.html)
* [Tiny C Compiler Reference Documentation](https://bellard.org/tcc/tcc-doc.html)

View File

@ -0,0 +1,27 @@
---
title: "👏🏻 Преобразование PDF в PNG в Linux"
date: 2023-08-19T23:31:10+03:00
draft: false
tags: [tips, books, images]
---
Как? Просто, [ImageMagick](https://imagemagick.org/)!
С помощью утилиты `convert`, которая входит в состав пакета imagemagick,
можно одной командой преобразовать PDF документ (или любую его страницу)
в изображение.
Команда выглядит следующим образом.
```sh
convert -density <xxx> <input.pdf>[99] -quality <yy> <output.png>
```
**Теперь о параметрах:**
* `-density xxx` значение плотности в DPI, напрмиер `150` или `300`.
* `-quality yy` значение сжатия выходного формата (значение `100` убирает сжатие).
* `<input.pdf>[99]` имя входного файла. Параметр в квадратных скобках `[99]`
устанавливает номер экспортируемой страницы (в PDF нумерация страниц начинается с нуля,
по-этому будет экспортирована 100 страница).
* `<output.png>` имя выходного файла.