--- 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)