В чем разница между -O0, -O1 и -g - PullRequest
1 голос
/ 12 марта 2012

Меня интересует использование -O0, -O1 и -g для включения символов отладки в lib. Некоторые предлагают использовать -O0 для включения символов отладки, а некоторые предлагают использовать -g.

Так какова фактическая разница между -g и -O0 и какая разница между -01 и -O0 и какая лучше использовать.

Ответы [ 5 ]

6 голосов
/ 12 марта 2012

-O0 - это уровень оптимизации 0 (без оптимизации, то же самое, что пропустить аргумент -O)

-O1 - это уровень оптимизации 1.

-g создает и внедряет символы отладкив двоичных файлах.

См. gcc docs и man-страницы для более подробного объяснения.

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

4 голосов
/ 12 марта 2012

-OX указывает уровень оптимизации , который будет выполнять компилятор. -g используется для генерации символов отладки.

2 голосов
/ 12 марта 2012

Из руководства GCC

http://gcc.gnu.org/onlinedocs/

3.10 Options That Control Optimization

-O -O1 Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time.

-O2 Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. As compared to -O, this option increases both compilation time and the performance of the generated code.

-O3 Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftree-vectorize and -fipa-cp-clone options.

-O0 Reduce compilation time and make debugging produce the expected results. This is the default.

-g Produce debugging information in the operating system's native format (stabs, COFF, XCOFF, or DWARF 2). GDB can work with this debugging information.

1 голос
/ 12 марта 2012

-O0 не включает символы отладки, он просто отключает оптимизацию в сгенерированном коде, что облегчает отладку (ассемблерный код более или менее непосредственно следует коду C).-g говорит компилятору создавать символы для отладки.

Возможно генерировать символы для оптимизированного кода (просто продолжайте указывать -g), но попытка пошагового выполнения кода или установки точек останова может не сработатьожидать, потому что выданный код, вероятно, не будет "следовать" за исходным C-источником.Таким образом, отладка в этой ситуации может быть значительно сложнее.

-O1 (что совпадает с -O) выполняет минимальный набор оптимизаций.-O0 по сути говорит компилятору не оптимизировать.Существует множество опций, которые позволяют очень точно контролировать то, как вы хотите, чтобы компилятор выполнял: http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Optimize-Options.html#Optimize-Options

0 голосов
/ 12 марта 2012

Как уже упоминалось, набор параметров -O указывает уровни оптимизации, которые должен выполнять компилятор, тогда как параметр -g добавляет символы отладки.по следующим ссылкам

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...