2014-09-21 2 views
2

Я использую пользовательские файлы make для моих проектов на C++. Я ищу наиболее рекомендуемые флаги компиляции для релизов. Я в настоящее время использую следующие:Рекомендуемые флаги сборки выпуска GCC

CXXFLAGS + = -O3 -Wall -DNDEBUG

Я думал, что выше было достаточно, но затем я попытался запустить инструмент «стрип» на двоичный и сократился размер довольно немного. Похоже, в двоичном коде все еще есть некоторые несущественные вещи.

Я знаю, что это широкая тема, но я ищу общие настройки для оптимизационных (скорость и размер) выпусков. Я знаю, что gcc по умолчанию даже не отбрасывает мертвый код - я хотел бы выяснить, как это сделать в ближайшее время.

Для справки мои настройки делают это https://github.com/YasserAsmi/buildmk

+0

Ах - раздражающие пользователи снова пытаются опротестовывать людей, задавая вопрос, когда им нужна помощь ... – YasserAsmi

+0

Да, очень популярно проголосовать, не оставляя никаких полезных комментариев, что, на мой взгляд, совершенно бессмысленно. Я не вижу в этом вопросе ничего плохого. –

ответ

2

Да, удаление после связывания приведет к удалению глобальных символов, которые включены в библиотеку C++, например. Вы можете получить g++, чтобы сделать это, используя опцию -s. Он делает отладку приложения на сайте клиента (например, говорит клиенту, что он запускает gdb myprog, а затем делает bt, когда он разбился, не даст вам никаких символов - гораздо сложнее узнать, где был код, если у вас нет одинакового двоичного кода с символами [или может воспроизвести один], и вы можете найти в нем символы [или вы можете воспроизвести проблему, но это принятие желаемого за действительное много времени]).

Если вы хотите использовать небольшой код, вы также можете использовать -Os вместо -O3, что заставит компилятор генерировать оптимизированный код, но не делает оптимизацию, которая делает код более крупным (так что только встроенные крошечные функции, а не разворачиваемые контуры , и т.д). Для НЕКОТОРЫХ случаев маленький код работает быстрее, чем «более высокий уровень оптимизации», но более крупный код, потому что функции среднего размера, которые вызываются во многих местах, остаются как одна функция, которая находится в кеше, а не встраивается и раздувается заявление.

К сожалению, часто трудно сказать, какой эффект имеет какой-либо конкретный вариант на размер исполняемого файла - в некоторых случаях вложение делает для меньшего кода, в других случаях код делает дольше. Развертка цикла со счетом 2 делает более короткий код, чем выполнение одной и той же вещи в цикле и т. Д. И т. Д. Если вам нужен быстрый и малый код, вам придется заниматься скриптингом и посмотреть, какие из них влияют на ВАШЕ код. Убедитесь, что вы отслеживаете, какой эффект вы получаете от каждого варианта. Существует довольно много разных вариантов оптимизации, перечисленных here (это для 4.9.1, вы можете найти онлайн-версии старых руководств также на сайте gcc).

+0

Спасибо Маты! Очень полезно. Я не понимал, что таблица символов - это то, что нужно раздеть. В этом есть смысл. Также -O - это то, что я не пробовал. – YasserAsmi

+0

Ну, '-s' будет делать, более или менее, то же самое, что и' strip', поэтому не ожидайте, что он «сделает магию». Но это на шаг меньше, чем первый запуск компилятора, а затем запуск 'strip' в результирующем двоичном файле.С другой стороны, у 'strip' есть куча элементов управления, которые позволяют вам точно настроить то, что вы удаляете (если вы просто запустите' strip' без параметров, он удалит «все»), и вы также можете использовать 'strip 'например, удалить разделы из файла, но только делать это, если вы ДЕЙСТВИТЕЛЬНО знаете, что делаете. –

+0

Да, извините, я имел в виду -O (была опечатка, которую я редактировал). Понятно, что они были такими же, как и полоса. Я на самом деле не планирую использовать полосу (я не хочу усложнять жизнь :)) – YasserAsmi

1
CXXFLAGS += -O3 -Wall -DNDEBUG 

отлично. Предполагая, что NDEBUG используется, я никогда не использую его лично. Если вам нужен меньший двоичный код, используйте таблицу символов таблицы «-s», которая похожа на полосу пропускания. Как правило, я не беспокоюсь и оставляю таблицу символов там, поскольку она все еще может быть полезна.

Смежные вопросы