Опция -g в g++, эквивалентная компилятору cl2010?

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

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

На этой странице есть разные библиотеки (отладка / выпуск) для ссылок.

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

2 ответа

Решение

В этом вопросе есть несколько отдельных частей: как сказать компилятору / компоновщику сгенерировать и сохранить "отладочную информацию" (отображение между исходным кодом и объектным кодом), как сказать компилятору по-разному компилировать код для облегчения отладки (Подумайте об 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 не нужны.

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

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

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

Другие вопросы по тегам