Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.24.192] |
|
Сообщ.
#1
,
|
|
|
Есть файл utils.inc, в котором набор функций, он используется в нескольких проектах. В каждом проекте нужны не все функции. Подскажите, пожалуйста, опцию компилятора, чтобы в исполняемый файл каждого из проектов добавлялся только используемый код.
|
Сообщ.
#2
,
|
|
|
В masm32 такое сделать заморочно. Нужно либо прописывать макросы типа #ifdef USE_INTTOSTR, а в главных исходниках делать #define USE_INTTOSTR для каждой функции. Естественно, не забывая о зависимостях (когда одна функция использует другую). Либо компилировать каждую функцию в отдельный объектный файл (obj) и объединять их в библиотеку (lib). Тогда при линковке будут добавляться только те объектники, которые используются.
В fasm такое делается элементарно, там есть if used. |
Сообщ.
#3
,
|
|
|
Значит это был другой ассемблер, помню что где-то была такая возможность, автоматически. Интересно, почему это не реализовано на стадии ассемблирования/линковки. Придётся дублировать один и тот же код на несколько проектов и исправлять если что одно и тоже в нескольких файлах.
|
Сообщ.
#4
,
|
|
|
kin01, потому что в ассемблерном коде всё может быть переплетено как угодно. Можно прыгать в функцию, скажем, просто убрав ret в конце первой; брать адреса одних меток и добавлением смещений других входить/брать что-то внутри других функции и пр, пр, пр. В некоторых ассемблерах вообще нет понятия функций, есть просто метки. Да и в masm с помощью proc можно просто разделять блоки кода, а не реальные функции. И т.д.
В fasm это реализовано просто. Перед каждой функцией пишем if used INTTOSTR, в конце – end if. Если указанный литерал (INTTOSTR) не используется, код не включается. |
Сообщ.
#5
,
|
|
|
Jin X, всё сегмент кода :-)
|
Сообщ.
#6
,
|
|
|
Компилятор в общем случае просто не знает, используется ли функция. Тот факт, что она не используется тут, не означает, что она не вызывается откуда-то ещё. Другое дело линкер, который из всех объектников собирает единый исполняемый модуль.
Так что да. Самый надёжный вариант – раскидать все функции по разным .asm, по одной на файл, все их скомпилить в .obj и собрать из них .lib. При сборке приложения просто указать линкеру эту либу, и он сам вытащит оттуда всё, что требуется, и ничего лишнего. |
Сообщ.
#7
,
|
|
|
Еще можно каждую функцию выразить в виде макроса, который будет включать ее при использовании. Это все с теми же #define/#ifdef, но тут хотя бы не надо вручную за этим следить. И вызовы к функции будут по ее имени, а не через команду call.
|
Сообщ.
#8
,
|
|
|
Цитата macomics @ Важно добавить, что при этом эти функции будут inline.Еще можно каждую функцию выразить в виде макроса, который будет включать ее при использовании. Кстати, я делал как-то "модуль" callx.inc, который как предназначен для того, чтобы отфильтровывать ненужные процедуры, см. тут: Механизм исключения неиспользуемых процедур из кода Сам уж забыл про это |
Сообщ.
#9
,
|
|
|
Цитата Jin X @ Важно добавить, что при этом эти функции будут inline. Я предполагал, что в макросы будут добавлены сами вызовы, а не код функций. |
Сообщ.
#10
,
|
|
|
macomics, тогда callx.inc – самое то
|