Что с этим «ЭЛТ не инициализирован» ошибка?

Я создал пустой проект C ++ в Visual Studio 2012 Express (конечно, для рабочего стола) и добавил некоторый случайный базовый код:

#include <cstdio>
#include <cstdlib>

typedef struct examplestruct
{
unsigned char num1;
unsigned short num2;
unsigned long num3;
unsigned long long num4;
} EXAMPLESTRUCT;

void examplefunction(unsigned long *num, int num2)
{
*num += num2;
return;
}

int main(int nArgs, char **pszArgs)
{
EXAMPLESTRUCT ExStructInstance = {0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF};
printf("%d, %d, %u, %ull\n", ExStructInstance.num1, ExStructInstance.num2, ExStructInstance.num3, ExStructInstance.num4);
unsigned long num5 = ExStructInstance.num1 + ExStructInstance.num2;
printf("%d\n", num5);
examplefunction(&num5, 10);
printf("%d\n", num5);
system("pause");
return 0;
}

(Если вам интересно, что это за чертовщина, я разбираю созданный исполняемый файл, чтобы посмотреть поведение оптимизирующего компилятора, а также узнать больше о сборке x86.)

Под Linker в настройках проекта я выбрал Multi-threaded (/MT) для библиотеки времени выполнения, поэтому она будет статически связывать ее.

Я скомпилировал и начал отладку с помощью F5 и сразу получил эту ошибку в окне сообщения:

Ошибка выполнения!

Программа: C: \ Users \ xxxxx \ Documents \ P …

R6030

  • CRT не инициализирован

Итак, эта базовая программа не будет работать из-за какой-то проблемы с библиотекой времени выполнения, которую я не могу понять!

Есть идеи? Я просто хотел бы знать, что здесь происходит. Заранее спасибо!

РЕДАКТИРОВАТЬ: К вашему сведению, все это делается в режиме выпуска.

4

Решение

Начните новый проект с шаблона «Пустой проект», который умеет создавать проблемы. Вы, вероятно, изменили другой параметр проекта, который заставляет вашу программу запускаться с помощью метода main () вместо обычной точки входа, функции запуска CRT. Который инициализирует CRT, затем вызывает main (). Трудно догадаться, как вы это сделали, особенно когда говорите об изменении настройки компоновщика для получения / MT. Это настройка компилятора.

Попасть в пропасть успеха, используя вместо этого шаблон проекта консольного приложения Win32 + Win2. Удалить предварительно сгенерированный код, минус #include <stdafx.h> line на вершине. По крайней мере, теперь у вас есть отправная точка, которая может помочь нам решить ваши проблемы. И не пропустите программу «Hello world».

2

Другие решения

Я исправил проблему, и это вина с моей стороны.

Я установил точку входа явно main в настройках компоновщика, когда его следовало оставить по умолчанию.

Консольная программа, использующая ЭЛТ, фактически имеет точку входа, называемую _mainCRTStartup, который инициализирует CRT перед вызовом программы main функция, которая является почти «псевдо-точкой входа».

Если вы сами установите точку входа в настройках компоновщика, _mainCRTStartup никогда не вызывается, поэтому CRT никогда не инициализируется; программа начинается в main и не может выполнять функции CRT.

Я просто удалил явно определенную точку входа, и все заработало.

Ты узнаешь что-то новое каждый день.

1

По вопросам рекламы [email protected]