Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

(Существуют другие формы опции -Z: -ZI, если вы хотите, чтобы поддержка "изменить и продолжить" в среде Visual Studio, но если вы используете 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, независимо от того, включает ли ваш код отладочную информацию, но обычно это хорошая идея - если вы собираетесь отлаживать проект, который вы хотите отлаживать, и если вы не собираетесь его отлаживать, вам не нужен лишний вес. Использование версий debug/release для данной библиотеки не повлияет на наличие доступных символов отладки (надеюсь, если кто-то, кто скомпилировал библиотеку, понял, что я сделал в предыдущем абзаце), но это повлияет на такие вещи, как assert и extra #ifdef _DEBUG кода в этой библиотеке.

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

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

Ответ 2

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

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

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