2 pcb: Заинтересовал Ваш анализ размера кода, потому что у меня получались результаты совсем другие. Решил проверить ещё раз.
Проверял на
своём проекте. Там и математики хватает, да и вообще он довольно крупный. Можете для сравнения своими версиями gcc тоже пройтись, было бы интересно на одном и том же коде сделать анализ разных компиляторов.
Итак, мои результаты.
1. Мой основной вариант - Linux, самосборный avr-gcc версии 4.8.3:
Спойлер
Код: Выделить всё
wiselord@wiselord src $ avr-gcc -v
Используются внутренние спецификации.
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/avr/gcc-bin/4.8.3/avr-gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/avr/4.8.3/lto-wrapper
Целевая архитектура: avr
Параметры конфигурации: /var/tmp/portage/cross-avr/gcc-4.8.3/work/gcc-4.8.3/configure --host=x86_64-pc-linux-gnu --target=avr --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/avr/gcc-bin/4.8.3 --includedir=/usr/lib/gcc/avr/4.8.3/include --datadir=/usr/share/gcc-data/avr/4.8.3 --mandir=/usr/share/gcc-data/avr/4.8.3/man --infodir=/usr/share/gcc-data/avr/4.8.3/info --with-gxx-include-dir=/usr/lib/gcc/avr/4.8.3/include/g++-v4 --with-python-dir=/share/gcc-data/avr/4.8.3/python --enable-languages=c,c++ --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.8.3 p1.1, pie-0.5.9' --enable-libstdcxx-time --enable-poison-system-directories --enable-shared --disable-threads --disable-bootstrap --enable-multilib --disable-altivec --disable-fixed-point --disable-libgcj --disable-libgomp --disable-libmudflap --disable-libssp --disable-libquadmath --enable-lto --without-cloog --disable-libsanitizer
Модель многопоточности: single
gcc версия 4.8.3 (Gentoo 4.8.3 p1.1, pie-0.5.9)
wiselord@wiselord src $ make
mkdir -p flash obj/audio obj/display obj/tuner
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/actions.o actions.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds18x20.o ds18x20.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display.o display.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/main.o main.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/rc5.o rc5.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/temp.o temp.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/fft.o fft.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds1307.o ds1307.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/input.o input.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/i2c.o i2c.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/adc.o adc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda731x.o audio/tda731x.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda7439.o audio/tda7439.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/audioproc.o audio/audioproc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tea5767.o tuner/tea5767.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tuner.o tuner/tuner.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tux032.o tuner/tux032.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/rda5807.o tuner/rda5807.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-24.o display/font-ks0066-ru-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-digits-32.o display/font-digits-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-08.o display/font-ks0066-ru-08.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-24.o display/icons-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-32.o display/icons-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/gdfb.o display/gdfb.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/st7920.o display/st7920.c
avr-gcc -g -Wall -Werror -mmcu=atmega32 -o obj/ampcontrol_m32fb_st7920.elf obj/actions.o obj/ds18x20.o obj/display.o obj/main.o obj/rc5.o obj/temp.o obj/fft.o obj/ds1307.o obj/input.o obj/i2c.o obj/adc.o obj/audio/tda731x.o obj/audio/tda7439.o obj/audio/audioproc.o obj/tuner/tea5767.o obj/tuner/tuner.o obj/tuner/tux032.o obj/tuner/rda5807.o obj/display/font-ks0066-ru-24.o obj/display/font-digits-32.o obj/display/font-ks0066-ru-08.o obj/display/icons-24.o obj/display/icons-32.o obj/display/gdfb.o obj/display/st7920.o -lm
avr-objcopy -O ihex -R .eeprom -R .nwram obj/ampcontrol_m32fb_st7920.elf flash/ampcontrol_m32fb_st7920.hex
./size.sh obj/ampcontrol_m32fb_st7920.elf
AVR Memory Usage:
Program: 27126 bytes (.text + .data)
Data: 1850 bytes (.data + .bss)
2. Windows (XP в VirtualBox),
WinAVR 20100110:
Спойлер
Код: Выделить всё
E:\Проекты\ampcontrol\src>avr-gcc -v
Using built-in specs.
Target: avr
Configured with: ../gcc-4.3.3/configure --enable-win32-registry=WinAVR-20100110 --with-gmp=/usr/local --with-mpfr=/usr/local --prefix=/c/WinAVR --target=avr --enable-languages=c,c++,objc --with-dwarf2 --enable-doc --disable-shared --disable-libada --disable-libssp --disable-nls --with-pkgversion='WinAVR 20100110' --with-bugurl='URL:http://sourceforge.net/tracker/?atid=520074&group_id=68108&func=browse'
Thread model: single
gcc version 4.3.3 (WinAVR 20100110)
E:\Проекты\ampcontrol\src>make
mkdir -p flash obj/audio obj/display obj/tuner
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/actions.o actions.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/adc.o adc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display.o display.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds1307.o ds1307.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds18x20.o ds18x20.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/fft.o fft.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/i2c.o i2c.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/input.o input.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/main.o main.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/rc5.o rc5.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/temp.o temp.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/audioproc.o audio/audioproc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda731x.o audio/tda731x.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda7439.o audio/tda7439.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/rda5807.o tuner/rda5807.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tea5767.o tuner/tea5767.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tuner.o tuner/tuner.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tux032.o tuner/tux032.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-digits-32.o display/font-digits-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-08.o display/font-ks0066-ru-08.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-24.o display/font-ks0066-ru-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-24.o display/icons-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-32.o display/icons-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/gdfb.o display/gdfb.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/st7920.o display/st7920.c
avr-gcc -g -Wall -Werror -mmcu=atmega32 -o obj/ampcontrol_m32fb_st7920.elf obj/actions.o obj/adc.o obj/display.o obj/ds1307.o obj/ds18x20.o obj/fft.o obj/i2c.o obj/input.o obj/main.o obj/rc5.o obj/temp.o obj/audio/audioproc.o obj/audio/tda731x.o obj/audio/tda7439.o obj/tuner/rda5807.o obj/tuner/tea5767.o obj/tuner/tuner.o obj/tuner/tux032.o obj/display/font-digits-32.o obj/display/font-ks0066-ru-08.o obj/display/font-ks0066-ru-24.o obj/display/icons-24.o obj/display/icons-32.o obj/display/gdfb.o obj/display/st7920.o -lm
avr-objcopy -O ihex -R .eeprom -R .nwram obj/ampcontrol_m32fb_st7920.elf flash/ampcontrol_m32fb_st7920.hex
./size.sh obj/ampcontrol_m32fb_st7920.elf
AVR Memory Usage:
Program: 28194 bytes (.text + .data)
Data: 1860 bytes (.data + .bss)
3. Windows (XP в VirtualBox), WinAVR 20100110, но уже gcc
посвежее:
Спойлер
Код: Выделить всё
E:\Проекты\ampcontrol\src>avr-gcc -v
Using built-in specs.
COLLECT_GCC=avr-gcc
COLLECT_LTO_WRAPPER=c:/avr-gcc-4.8_2013-03-06_mingw32/bin/../libexec/gcc/avr/4.8.0/lto-wrapper.exe
Target: avr
Configured with: ../../gcc.gnu.org/trunk/configure --target=avr --prefix=/local/gnu/install/gcc-4.8-mingw32 --host=i386-mingw32 --build=i686-linux-gnu --enable-languages=c,c++ --disable-nls --disable-shared --with-dwarf2
Thread model: single
gcc version 4.8.0 20130306 (experimental) (GCC)
E:\Проекты\ampcontrol\src>make
mkdir -p flash obj/audio obj/display obj/tuner
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/actions.o actions.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/adc.o adc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display.o display.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds1307.o ds1307.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/ds18x20.o ds18x20.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/fft.o fft.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/i2c.o i2c.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/input.o input.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/main.o main.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/rc5.o rc5.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/temp.o temp.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/audioproc.o audio/audioproc.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda731x.o audio/tda731x.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/audio/tda7439.o audio/tda7439.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/rda5807.o tuner/rda5807.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tea5767.o tuner/tea5767.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tuner.o tuner/tuner.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/tuner/tux032.o tuner/tux032.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-digits-32.o display/font-digits-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-08.o display/font-ks0066-ru-08.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/font-ks0066-ru-24.o display/font-ks0066-ru-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-24.o display/icons-24.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/icons-32.o display/icons-32.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/gdfb.o display/gdfb.c
avr-gcc -g -Wall -Werror -lm -Os -mcall-prologues -fshort-enums -mmcu=atmega32 -DF_CPU=16000000L -DST7920 -c -o obj/display/st7920.o display/st7920.c
avr-gcc -g -Wall -Werror -mmcu=atmega32 -o obj/ampcontrol_m32fb_st7920.elf obj/actions.o obj/adc.o obj/display.o obj/ds1307.o obj/ds18x20.o obj/fft.o obj/i2c.o obj/input.o obj/main.o obj/rc5.o obj/temp.o obj/audio/audioproc.o obj/audio/tda731x.o obj/audio/tda7439.o obj/tuner/rda5807.o obj/tuner/tea5767.o obj/tuner/tuner.o obj/tuner/tux032.o obj/display/font-digits-32.o obj/display/font-ks0066-ru-08.o obj/display/font-ks0066-ru-24.o obj/display/icons-24.o obj/display/icons-32.o obj/display/gdfb.o obj/display/st7920.o -lm
avr-objcopy -O ihex -R .eeprom -R .nwram obj/ampcontrol_m32fb_st7920.elf flash/ampcontrol_m32fb_st7920.hex
./size.sh obj/ampcontrol_m32fb_st7920.elf
AVR Memory Usage:
Program: 27116 bytes (.text + .data)
Data: 1850 bytes (.data + .bss)
Невооружённым взглядом видно, что 4.8 генерирует код более компактный, чем хотя бы 4.3. В своё время, когда проект был ещё на ATmega16, и перестал влезать в контроллер, переход с gcc-4.7 на gcc-4.8 дал очень неплохой результат.
Также проверил некоторые опции, подсказанные уважаемым
ARV.
Исходный вариант:
Код: Выделить всё
Program: 27126 bytes (.text + .data)
Data: 1850 bytes (.data + .bss)
После добавления
-ffunction-sections компилятору и
-Wl,-gc-sections линкеру
Код: Выделить всё
Program: 26590 bytes (.text + .data)
Data: 1850 bytes (.data + .bss)
Добавление
-fno-split-wide-types увеличило на 10 байт размер кода
Параметр
inline-call-cost у меня не поддерживается вообще - нагуглил, что это не стандартная в gcc вещь, добавляется каким-то сторонним патчем.
Опция
-fno-unroll-loops эффекта на размер кода не оказала.
В общем, для себя нахожу полезным только связку
-ffunction-sections / -Wl,-gc-sections. Ну и
-fdata-sections аналогично. Раньше запустить этот параметр (насколько я понимаю, что что-то вроде strip неиспользуемых в коде функций) у меня не получалось, так как пробовал либо первую, либо вторую половины, но не в связке вместе. За подсказку спасибо
ARV. Библиотеки я страюсь писать достаточно универсальные, чтобы использовались не только в одном проекте, и часто получается так, что часть функций компилируется, но не используется. И подобного strip-а не хватало.