Смешивание библиотек отладки и выпуска: Windows vs Linux, static vs shared - PullRequest
0 голосов
/ 19 апреля 2019

Этот вопрос уже задавался a несколько раз , но я заметил, что он всегда относится к Windows. Что имеет смысл, учитывая, что MSVC завершается с ошибкой:

ошибка LNK2038: обнаружено несоответствие для _ITERATOR_DEBUG_LEVEL: значение «0» не соответствует значению «2» в main.obj

И мне кажется, что в Linux он не выходит из строя во время сборки.

В ответах упоминается разное время выполнения C ++ между типами сборки и отсутствие совместного использования ресурсов CRT между такими библиотеками. Тем не менее, мне не ясно, насколько отличается это поведение в Linux / Windows и совместно используемых / статических библиотеках.

Я хотел бы понять это лучше. Вопросы могут быть:

  1. Отличается ли он между Windows и Linux?
  2. Если это также неопределенное поведение в Linux, почему же оно не дает сбой во время сборки?
  3. Отличается ли он между статическими и общими библиотеками?
  4. Мой менеджер пакетов Linux загружает отладочные версии всех пакетов dev? Заглядывая в usr/lib/, я не могу найти там библиотек релизов и отладки ...

1 Ответ

2 голосов
/ 19 апреля 2019

Да, Linux и Windows разные.Я не могу много рассказать о Windows, но с набором инструментов Linux у нас на самом деле нет раздельной сборки Debug vs Release.

У нас есть несколько вариантов:

  • , какие оптимизации включены?
  • следует ли выводить символы отладки?
  • некоторые другие менее важные вещи.

Какой набор инструментов сборки называется "Release" или "Debug", это просто наборвариантов.например, минимальная версия выпуска CMake использует -Os -DNDEBUG, а отладочная версия CMake использует -g.Дистрибутивы также добавляют дополнительные опции, когда они упаковывают вещи.

Но кроме этих опций ABI одинаков, поэтому они все совместимы (за исключением опций, специально помеченных [*] - но они не используются в типичныхстроит).Так что это не имеет значения.Вы можете смешивать объекты «debug» или «release», это будет работать.

Что касается 4), то, как это делают многие дистрибутивы, они строят с разделенными отладочными символами.Это означает, что отладочная информация отправляется в отдельном файле и обычно упаковывается независимо.Например:

ii  libc6:amd64       2.27-3ubuntu1  GNU C Library: Shared libraries
ii  libc6-dbg:amd64   2.27-3ubuntu1  GNU C Library: detached debugging symbols

Второй пакет обычно не устанавливается.Я установил его вручную, чтобы пройти через libc6 с полной отладочной информацией.


[*] В качестве примера, посмотрите Опции генерации кода GCC .Вы увидите, что те, которые генерируют несовместимые объекты, имеют предупреждение.

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