Процесс для сокращения размера исполняемого файла

Если это единственные рабочие листы в вашей рабочей тетради, добавьте Dim w as Worksheet вверху вашего подпункта и измените

    If Worksheets("Datasheet").Cells(x, Z) = "" Or Worksheets("Datasheet").Cells(x, Z) = "Empty" Then
        FinalCell = x & ":" & x
        Rows(FinalCell).Hidden = True      'Deletes the row
    End If

на

    If Worksheets("Datasheet").Cells(x, Z) = "" Or Worksheets("Datasheet").Cells(x, Z) = "Empty" Then
        FinalCell = x & ":" & x
        For Each w In ThisWorkbook.Worksheets
            w.Rows(FinalCell).Hidden = True
        Next w
    End If

, если они не являются только рабочие листы в вашей рабочей тетради

    If Worksheets("Datasheet").Cells(x, Z) = "" Or Worksheets("Datasheet").Cells(x, Z) = "Empty" Then
        FinalCell = x & ":" & x
        Worksheets("DataSheet").Rows(FinalCell).Hidden = True
        Worksheets("YourSheet1").Rows(FinalCell).Hidden = True
        Worksheets("YourSheet2").Rows(FinalCell).Hidden = True
        Worksheets("YourSheet3").Rows(FinalCell).Hidden = True
    End If
13
задан Jens 5 June 2018 в 11:44
поделиться

6 ответов

Общий список:

  • Удостоверьтесь, что у Вас есть компилятор и отключенные параметры отладки компоновщика
  • Скомпилируйте и свяжитесь со всеми включенными опциями размера (-OS в gcc)
  • Выполненный strip на исполняемом файле
  • Генерируйте файл карты и проверьте свои функциональные размеры. Можно или заставить компоновщика генерировать файл карты (-M при использовании ld), или можно использовать objdump на заключительном исполняемом файле (обратите внимание, что это будет только работать над неразделенным исполняемым файлом!) Это на самом деле не решит проблему, но она сообщит худших преступников.
  • Использовать nm исследовать символы, которые называют от каждого из Ваших объектных файлов. Это должно помочь в нахождении, кто вызывает функции, которые Вы не хотите названный.

В исходном вопросе был дополнительный вопрос о включении только соответствующих функций. gcc будет включать все функции в каждом объектном файле, который используется. Для помещения этого иначе, если у Вас есть объектный файл, который содержит 10 функций, все 10 функций включены в Ваш исполняемый файл, даже если один 1 на самом деле называют.

Стандартные библиотеки (например, libc) разделят функции на многие файлы отдельного объекта, которые затем заархивированы. Исполняемый файл затем связан против архива. Путем разделения на многие объектные файлы компоновщик может включать только функции, которые на самом деле вызваны. (это предполагает, что Вы статически связываетесь),

Нет никакой причины, почему Вы не можете сделать того же приема. Конечно, Вы могли утверждать, что, если функции не вызваны, Вы могут, вероятно, удалить их сами.

Если Вы статически связываетесь против других библиотек, можно выполнить инструменты, упомянутые выше по ним также, чтобы удостовериться, что они следуют подобным правилам.

14
ответ дан 1 December 2019 в 22:08
поделиться

Другая оптимизация, которая могла бы сохранить Вас работа, - ffunction-разделы,-Wl, - разделы gc, предполагая использование GCC. Хорошему набору инструментальных средств не должны будут говорить это, все же.

Объяснение: GNU ld разделы ссылок и GCC испускает один раздел на единицу перевода, если Вы не говорите это иначе. Но в C++, узлы в dependecy графике являются объектами и функциями.

5
ответ дан 1 December 2019 в 22:08
поделиться

Только, чтобы перепроверить и зарегистрировать для дальнейшего использования, но Вы используете инструкции по Ползунку? Они - версии на 16 битов нормальных инструкций. Иногда Вам, возможно, понадобились бы 2 инструкции на 16 битов, таким образом, это не сохранит 50% в пространстве кода.

Достойный компоновщик должен взять просто необходимые функции. Однако Вам, возможно, понадобились бы компилятор и linke настройки для упаковки функций для отдельного соединения.

2
ответ дан 1 December 2019 в 22:08
поделиться

На очень встроенных проектах я всегда стараюсь не использовать любые стандартные библиотечные функции. Даже простые функции как "стертол ()" аварийно завершают двоичный размер. Если возможно просто избегают тех вызовов.

В наиболее очень встроенных проектах Вам не нужно универсальное "printf ()", или динамическое выделение памяти (много контроллеров имеют 32 КБ или меньше RAM).

Вместо того, чтобы просто использовать "printf ()" я использую очень простое пользовательское "printf ()", эта функция может только распечатать числа в шестнадцатеричном или десятичном формате не больше. Большинство структур данных предварительно выделяется во время компиляции.

2
ответ дан 1 December 2019 в 22:08
поделиться

Хорошо так в конце я просто уменьшил проект до, он - самая простая форма, затем медленно добавляемые файлы один за другим до, функция, которую я хотел удалить, появилась в 'readelf' файле. Затем, когда у меня был файл, я прокомментировал все, и медленно включайте вещи назад, пока функция не открылась снова. Таким образом в конце я узнал то, что назвало его и удалило все те вызовы... Теперь это работает, как желаемый... сладкое!

Должен быть лучший способ сделать это все же.

1
ответ дан 1 December 2019 в 22:08
поделиться

Вы могли посмотреть на что-то как исполняемое сжатие.

-2
ответ дан 1 December 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: