Параметр -g в g ++, эквивалентный компилятору VS2010 cl? - PullRequest
18 голосов
/ 11 января 2011

С g ++ с параметром -g я могу использовать gdb для целей отладки.

Что эквивалентно этой опции с компилятором Visual Studio 2010 cl.exe?

Эта страница имеет различные библиотеки (отладка / выпуск) для компоновки.

Если я компилирую с опцией отладки с помощью cl.exe, должен ли я использовать соответствующие опции компоновки библиотеки (/ MD / MT против / MDd / MTd)?

Ответы [ 2 ]

33 голосов
/ 11 января 2011

В этом вопросе есть несколько отдельных частей: как сказать компилятору / компоновщику сгенерировать и сохранить «отладочную информацию» (отображение между исходным кодом и объектным кодом), как сказать компилятору компилировать код по-другому, чтобы сделать легче отладить (подумайте об assert () и #ifdef _DEBUG) и о том, содержат ли предварительно откомпилированные библиотеки, которые вы ссылаетесь в ваш проект, информацию об отладке.

-Zi (флаг для компилятора CL, указывающий, что он должен генерировать отладочную информацию) является эквивалентом флага -g для gcc.

(Существуют и другие формы параметра -Z: -ZI, если вы хотите поддержку "редактировать и продолжить" в Visual Studio IDE, но если вы используете IDE, вы, вероятно, используете его интерфейс для компилятора настройки вместо того, чтобы манипулировать ими напрямую, и -Z7, если вы хотите отладочную информацию старого формата CodeView; всякий раз, когда я вызывал CL напрямую, всегда был -Zi, который я хотел.)

Обратите внимание, что использование опции -Zi (или -ZI) обычно создает файл .pdb для каждого каталога, но когда вы связываете код вместе, он может быть получен из файлов .obj, представленных в разных файлах .pdb, и вы также хотите объединить эти отдельные файлы .pdb в основной, представляющий код, который вы связали вместе - для этого и нужен ключ -debug для компоновщика.

Также обратите внимание: это может показаться нелогичным, но всегда используйте -Zi (для CL) и -debug (для link.exe). Даже для кода, который вы собираетесь выпустить. Он не увеличивает размер вашего исполняемого файла и не передает секреты вашим клиентам, поскольку отладочная информация помещается в отдельный файл .pdb (который вы не будете отправлять клиентам). Если есть шанс, что вам когда-нибудь придется его отлаживать, вам понадобится .pdb. (-Zi даже несовместима с оптимизацией, хотя -ZI есть. Так что вы можете скомпилировать ваши «отладочные» сборки с -ZI, а ваши «релизы» с помощью «-Zi -O2».)

Что касается библиотек: вам не нужно строго сопоставлять свойство debug / release библиотеки времени выполнения C с тем, содержит ли ваш код отладочную информацию, но обычно это хорошая идея - если вы собираетесь отлаживать проект, который вы хотите иметь возможность отлаживать все это, и если вы не собираетесь отлаживать это, вам не нужен дополнительный вес. Использование версий отладки / выпуска данной библиотеки не повлияет на то, есть ли в ней доступные символы отладки (надеюсь, если тот, кто скомпилировал библиотеку, понял пункт, который я сделал в предыдущем абзаце), но это повлияет на такие вещи, как assert и extra #ifdef _DEBUG код в этой библиотеке.

Это относится ко всем библиотекам, с которыми вы связываетесь, но особенно к библиотеке времени выполнения C - Microsoft добавила дополнительный код обнаружения ошибок в malloc () и free (). Поэтому, если что-то в вашем проекте использует разновидность отладки библиотеки CRT, все это должно быть.

Опции / M (/ MTd и / MDd), на мой взгляд, странны и волшебны - они просто псевдонимы для сложного набора других вещей, происходящих за кулисами. Возьмите, например, / MDd, задокументированный как «Определяет _DEBUG, _MT и _DLL», и заставляет ваше приложение использовать отладочную многопоточную и специфичную для DLL версию библиотеки времени выполнения. Это также заставляет компилятор поместить имя библиотеки MSVCRTD. lib в файл .obj. " Здесь это влияет как на препроцессор (определяющий _DEBUG и некоторые другие символы препроцессора), так и на компоновщик (он фактически помещает комментарий #pragma (линкер) в ваш исходный код). Если вы заботитесь о том, что происходит, и не понимаете этого, это может вызвать реальные проблемы - я видел, что многие проекты, которые не используют IDE, увязли в предупреждениях как о msvcrt.lib, так и msvcrtd.lib. связи и т. д. К тому времени, когда вы поймете, как безопасно использовать эти параметры (/ M), они вам больше не нужны! Я предпочитаю делать это явно: указывать «-D _DEBUG» непосредственно там, где мне это нужно, указывать, с какими библиотеками связываться явно (и использовать -nodefaultlib), и тогда параметры / M не нужны.

6 голосов
/ 11 января 2011

Вам нужен один из вариантов генерации отладочной информации (/Z7, /Zi или /ZI).

Если вы используете один из них, вам также следует передать опцию / DEBUG компоновщику.

Вам также понадобится установить связь с отладочной версией библиотек времени выполнения (/MDd или /MTd). Это важно, потому что эти версии отличаются от своих версий выпуска (например, их процедуры выделения памяти несовместимы).

...