Как построить в режиме релиза с оптимизацией в GCC? - PullRequest
15 голосов
/ 08 октября 2009

Какие конкретные параметры мне нужно будет создать в «режиме выпуска» с полной оптимизацией в GCC? Если есть несколько вариантов, перечислите их все. Спасибо.

Ответы [ 4 ]

20 голосов
/ 08 октября 2009

Вот часть Makefile, которую я регулярно использую (в этом примере она пытается собрать программу с именем foo ).

Если вы запустите его как $ make BUILD=debug или $ make debug тогда будет использоваться Debug CFLAGS. Они отключают оптимизацию (-O0) и включают символы отладки (-g).

Если вы опустите эти флаги (запустив $ make без каких-либо дополнительных параметров), вы создадите версию Release CFLAGS, в которой включена оптимизация (-O2), символы отладки удалены (-s) и утверждения отключены (-DNDEBUG).

Как и предполагали другие, вы можете поэкспериментировать с различными настройками -O* в зависимости от ваших конкретных потребностей.

ifeq ($(BUILD),debug)   
# "Debug" build - no optimization, and debugging symbols
CFLAGS += -O0 -g
else
# "Release" build - optimization, and no debug symbols
CFLAGS += -O2 -s -DNDEBUG
endif

all: foo

debug:
    make "BUILD=debug"

foo: foo.o
    # The rest of the makefile comes here...
18 голосов
/ 08 октября 2009

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

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

Или ответ, который вы хотите: -O3

8 голосов
/ 08 октября 2009

Обратите внимание, что у gcc нет "режима выпуска" и "режима отладки", как у MSVC. Весь код это просто код. Наличие различных опций оптимизации (-O2 и -Os - это единственные, о которых вам обычно нужно заботиться, если вы не выполняете очень тонкую настройку), изменяет сгенерированный код, но не таким образом, чтобы предотвратить взаимодействие с другими ABI-совместимыми код. Как правило, вы хотите оптимизировать материал, который хотите выпустить.

Наличие опции "-g" приведет к тому, что расширенная информация о символах и исходном коде будет помещена в сгенерированные файлы, что полезно для отладки, но увеличивает размер файла (и раскрывает ваш исходный код), что то, что вы часто не хотите в «выпущенных» двоичных файлах.

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

4 голосов
/ 08 октября 2009

-O2 включит все оптимизации, которые не требуют компромисса между пробелом и скоростью, и, как мне кажется, используется чаще всего. -O3 делает некоторое пространство для компромиссов скорости (например, встроенная функция.) -Os делает O2 плюс делает другие вещи, чтобы уменьшить размер кода. Это может сделать вещи быстрее, чем O3, улучшив использование кэша. (проверьте, чтобы выяснить, работает ли он для вас.) Обратите внимание, что существует большое количество параметров, которые не затрагиваются ни одним из переключателей. Причина, по которой они не учитываются, заключается в том, что это часто зависит от того, какой код вы пишете, или сильно зависит от архитектуры.

...