.crt раздел? Что означает это предупреждение? - PullRequest
7 голосов
/ 30 июня 2011

Недавно я получил это предупреждение (VC ++ 2010)

warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

Я предполагаю, что это критический раздел.Прошло много времени с моего курса по операционным системам, поэтому я не могу понять, что это значит.Если я правильно помню, Critical Section работает с общими ресурсами.Так, как это предупреждение связано и что оно означает точно?

Ответы [ 4 ]

8 голосов
/ 30 июня 2011

Нет, CRT = C Время работы.Это библиотека поддержки, которая нужна любой программе для выполнения работы.Вещи как strcpy () живут там.Вы получаете «.CRT раздел» в вашем файле .obj, когда ваш код содержит глобальные переменные, которые должны быть инициализированы до запуска вашей программы.ЭЛТ позаботится об этом.

В этом нет ничего необычного.Проблема в том, что компоновщик не видел, как CRT был связан с вашей программой.Вы как-то написали код, который не зависел от кода CRT, кроме требования инициализации.Очень странно, никогда не слышал ни о ком, кто имеет эту проблему.Следуйте контрольному списку в документации , чтобы увидеть, соответствует ли один из них вашему делу.

7 голосов
/ 30 июня 2011

Документы MSDN достаточно хорошо охватывают это:

В некотором коде были введены статические инициализаторы или терминаторы, но CRT или его эквивалент (который должен запускать статические инициализаторы или терминаторы)) не запускается при запуске приложения.Примеры кода, который может вызвать это:

  • Глобальная переменная класса с таблицей конструктора, деструктора или виртуальной функции.
  • Глобальная переменная, инициализированная с постоянной времени компиляции.

Чтобы устранить эту проблему:

  • Добавьте msvcrtxx.lib, libc.lib, libcd.lib, libcmt.lib или libcmtd.lib в командную строку компоновщика или
  • Удалите весь код со статическими инициализаторами.
  • Не используйте /NOENTRY.

Поэтому я бы проверил ваш код на предмет недавнего добавления созданных объектовв статической или глобальной области видимости.Если вы не найдете ничего, возможно, они прячутся в сторонней библиотеке, с которой вы ссылаетесь.В любом случае, наиболее вероятным решением будет установить связь с ЭЛТ, используя первое предложение в разделе «Чтобы решить эту проблему» выше.

3 голосов
/ 03 июля 2017

предупреждение LNK4210: секция .CRT существует; могут быть необработанные статические инициализаторы или ограничители

Эта ошибка вызвана из-за спецификации точки входа в свойствах проекта.

Следуйте инструкциям ниже и посмотрите, будет ли ваша ошибка исправлена:

1.Нажмите правой кнопкой мыши свой проект в обозревателе решений (VS 2013)

2. Перейти к свойствам - Все конфигурации

3.Linker - точка входа. Удалить точку входа, если вы ее указали.

Нет необходимости указывать точку входа, поскольку BOOST_TEST автоматически определяет точку входа.

Надеюсь, это поможет и для других ошибок инициализатора. Ура!

1 голос
/ 04 марта 2014

У меня возникла та же проблема, вручную указав «пользовательскую» запись в моей DLL. Я удалил эту пользовательскую запись DLL и просто использую имя по умолчанию DLLMain, и оно снова работает ... странно.

...