Не могу откомпилировать модули из Borland C++ 3.1
При компиляции файла с расширением С в среде Visual С++ 6.5
Получаю ошибку:
fatal error C1010: unexpected end of file while looking for precompiled header directive
модули перенесены из Borland C++ 3.1. ранее использовались в Dos версии.
Сейчас встала необходимость включить их в диалоговое приложение Windows.
Та же ошибка и при компиляции в консольном приложении без поддержки MFC
Помогите, кто может. В Visual C я новичок.
Заранее благодарен,
с уважением, Ефремов.
Здравствуйте.
При компиляции файла с расширением С в среде Visual С++ 6.5
Получаю ошибку:
fatal error C1010: unexpected end of file while looking for precompiled header directive
модули перенесены из Borland C++ 3.1. ранее использовались в Dos версии.
Сейчас встала необходимость включить их в диалоговое приложение Windows.
Та же ошибка и при компиляции в консольном приложении без поддержки MFC
Помогите, кто может. В Visual C я новичок.
Заранее благодарен,
с уважением, Ефремов.
Ты используешь precompiled headers.
Два варианта решения проблемы:
1) отключить использование precompiled headers в настройках проекта;
2) вкоючить в начало всех *.c, *.cpp файлов заголовочный файл stdafx.h
[COLOR=blue]1) отключить использование precompiled headers в настройках проекта; [/COLOR]
Отлично сработало.
Я в VC новичок, если не затруднит, подскажите, для чего нужна эта опция – вроде все необходимые заголовки можно в исходном файле записать.
[COLOR=blue]2) включить в начало всех *.c, *.cpp файлов заголовочный файл stdafx.h [/COLOR]
Этот вариант не срабатывает, да он для меня не приемлем –исходники DOS должны оставаться в неизменном виде.
Еще раз СПАСИБО,
С уважением, Ефремов.
Большое спасибо, Green.
[COLOR=blue]1) отключить использование precompiled headers в настройках проекта; [/COLOR]
Отлично сработало.
Я в VC новичок, если не затруднит, подскажите, для чего нужна эта опция – вроде все необходимые заголовки можно в исходном файле записать.
[COLOR=blue]2) включить в начало всех *.c, *.cpp файлов заголовочный файл stdafx.h [/COLOR]
Этот вариант не срабатывает, да он для меня не приемлем –исходники DOS должны оставаться в неизменном виде.
Еще раз СПАСИБО,
С уважением, Ефремов.
Нужно проверить заголовочные файлы. Некоторые из них (вроде <except.h>,<conio.h>) отсутствуют в Visual C++ - это относится и к BGI.
Мне кажется, если пакет делает какие-либо сложные расчеты, стоит разделить его на вычислит. и интерфейсную части и переносить их отдельно. Первая перенесется легче, вторая зависит от среды разработки и ОС.
Большое спасибо, Green.
[COLOR=blue]1) отключить использование precompiled headers в настройках проекта; [/COLOR]
Отлично сработало.
Я в VC новичок, если не затруднит, подскажите, для чего нужна эта опция – вроде все необходимые заголовки можно в исходном файле записать.
Эта опция в конечном счете не на что не влияет, но существенно ускоряет сборку проекта...
Представь, ты пишешь приложение под MFC. MFC - эдакий монстр с кучей определений и т.п. Понятно, что в каждый модуль (.cpp) должен знать об функциях и классах MFC. Представь, как бы все тормозно собиралось, если хидеры MFC включались бы в каждый модуль?? Для этого и существует stdafx.h, в него включаются все необходимые для всего приложения хидеры и он сам включается в каждый модуль... Теперь откомпилировав один раз stdafx.cpp мы имеем как-бы "откомпиленную приставку" для каждого модуля .сpp...
Большое спасибо всем откликнувшимся.
С компиляцией становится понятно. Но возникла новая неожиданная проблема.
Все модули компилируются замечательно. Объектные файлы создаются. Но при линковании выдается сообщение:
Pages.obj : error LNK2001: unresolved external symbol "void __cdecl initd(void)" (?initd@@YAXXZ)
initd - модуль DOS и так на все имена из DOS-овских файлов.
Что я делал:
1) Посмотрел в map карте (построив без вызова initd()). Имена есть.
2) Включил принудительно в проект при линковании initd.obj (Setting/Link/input). Получил две ошибки:
INITD.OBJ : error LNK2005: _initd already defined in initd.obj
Pages.obj : error LNK2001: unresolved external symbol "void __cdecl initd(void)" (?initd@@YAXXZ)
3) перетащил объектные файлы в «левый» каталог и исключил все DOS модули из проекта. Естественно, указав путь линковщику. Все равно не разрешает ссылки (первая ошибка).
4) даже знак подчеркивания ставил в имени функции (я знаю, что компилятор ставит подчеркивание сам) – не помогло.
michael_is_98 писал:
[COLOR=blue]«Мне кажется, если пакет делает какие-либо сложные расчеты, стоит разделить его на вычислит. и интерфейсную части и переносить их отдельно.» [/COLOR]
Верно. интерфейсную часть DOS как раз и меняю. Весь интерфейс новый под Windows. От DOS лишь вычислительные модули.
С уважением, Ефремов.
Затмение нашло.
Функцию достаточно объявить: extern “C” functionName()
И проблема решена.
С переменными сложнее – приходится в модулях *.CPP объявлять отдельно с extern “C”, но это нудно.
Может есть более элегантный прием?
#pragma какая ни будь? Пока я не нашел.
С уважением. Ефремов.