Как уменьшить размер плагина

(на примере Borland C++ 5.02)
Валентин Скирдин [vskirdin@mail.ru]vskirdin@mail.ru

Основная часть моей сознательной программистской жизни была связана с компиляторами от фирмы Borland: сначала TurboC 2.5, потом Borland C++ 3.1, сейчас это Borland C++ 5.02. Именно как я стремился уменьшить размер плагина "EditSwap" сейчас и опишу...

По началу все как обычно - создаем проект (DLL, Win32 Console, Dinamic), генерим MAK-файл и с этим MAK-файлом и работаем... Можно конечно и из среды все это дело скомпилить, но то, о чем я Вам сейчас расскажу, такого сделать в IDE не получится...

...После компиляции размер DLL`я получился примерно 8K. Попробовал - заработало. Написал письмо Рошалу "о своих достижениях" и приатачил к письму архив со своим "творением"... Вот что я получил в ответ:

Ты его похоже слинковал с dynamic libraries, так что при отсутствии cw3230.dll он не грузится. В принципе можешь закачать его на ftp://rwntug.quarta.msk.ru. Правда там уже лежит аналогичный - qwerty.rar, но он тоже слинкован с dynamic libraries и соответственно почти ни у кого не запускается :-)

...Скомпилил без dynamic libraries - увы, размер DLL`лины увеличился раз в семь :-(. Странно - оригинальный EditCase после компиляции получался либо таким же монстром либо требовал cw3230.dll... У Рошала выяснил, что...

Генерируешь makefile, а потом убираешь из него startup code: это строка с c0d32.obj. Правда после этого некоторые функции сишной библиотеки становятся недоступными (например, распределение памяти), и приходится напрямую обращаться к Win32 API.

Пробую - не получается - линковщик выдает ошибки - чой-то найти не смог... Оказалось, что вместо TLINK стоял ILINK. Заменил ILINK на TLINK и... опять строка cw3230.dll присутствует в файле...

...Последняя правка MAK-файла привела к желаемому результату - компактно и не требует дополнительных DLL-файлов. Вот то, что у меня получилось:

# Borland C++ IDE generated makefile
#
.AUTODEPEND

#
# Borland C++ tools
#
IMPLIB  = Implib
BCC32   = Bcc32 +BccW32.cfg
TLINK32 = TLink32
TLIB    = TLib

#
# Dependency List
#
Dep_EditSwap = editswap.lib

EditSwap : BccW32.cfg $(Dep_EditSwap)
  echo MakeNode

editswap.lib : editswap.dll
  $(IMPLIB) $@ editswap.dll

Dep_editswapddll = editswap.obj

editswap.dll : $(Dep_editswapddll)
  $(TLINK32) @&&|
# Если здесь ставить  ILINK32 - то без c0d32.obj ну ни как...
  -Tpd -ap -c -w-dll -LU:\BC5\LIB -x +
# c:\bc5\lib\c0d32.obj - если эту строку оставить, то размерчик...
editswap.obj
$<,$*
C:\BC5\LIB\import32.lib+
C:\BC5\LIB\cw32.lib
# C:\BC5\LIB\cw32i.lib - эта строка приводила к cw3230.dll

|
editswap.obj :  editswap.cpp
  $(BCC32) -c @&&|
  -o$@ editswap.cpp
|

# Compiler configuration file
BccW32.cfg :
   Copy &&|
-w
-v-
...
-a1
-IC:\BC5\INCLUDE
| $@

Вот, собственно и все. Шаманство да и только :-)

Хотя, скажу по секрету, все равно получаются монстры. И это, естественно, зависит от набора используемых функций...


 

P.S.
Однажды, 30 Jun 1999, Владимир Тарасов (tsoftgroup@chat.ru) написал, что не использует MAK-файлы для построения плагинов:
ну вобщем, я использовал ручной метод сборки, т.е. у меня bat-ник такого содержания:

@echo off
del qwerty.dll
del qwerty.lib
del qwerty.obj
bcc32 -c -M- qwerty.cpp
tlib qwerty.lib +qwerty.obj
tlink32 -Tpd -aa qwerty.obj, qwerty.dll, , import32 cw32

...вот этим я сейчас и пользуюсь. Иногда приходится некоторые функции выдирать из стандартной библиотеки и, перелопатив их, "подсовывать" компилятору, но это уже совсем другая история.


 
31.05.1999
наверх