Необходимость использования Release версии библиотек MFC/CRT при компиляции ObjectARX приложения
Вопрос:
Мое приложение использует динамические версии MFC и DLL библиотеку времени выполнения. Когда я линкую Debug версию, появляется предупреждение о конфликте MSVCRT с другими библиотеками. Когда я использую ключ линковки /verbose:lib, я вижу, что линкуются debug-версии MFC и библиотеки времени выполнения. Руководство пользователя ObjectARX указывает не использовать debug-версии. Что следует сделать, чтобы линковать с release-версиями MFC?
Решение:
Все что нужно сделать – это убрать определение _DEBUG при включении файлов заголовков MFC header
Лучшее место для этого – файл STDAFX.H, генерируемый AppWizard.
Примечание: Файлы заголовков MFC/CRT проверяют определена ли _DEBUG, и если да, то линкуются debug-версии библиотек, а если нет, то release-версии библиотек. Так как DLL выполняется внутри release-продукта, такого как AutoCAD, то она должна быть линкована с release-версиями MFC и CRT библиотек для предотвращения смешения хипов и возможного краша из-за этого из-за debug-компилированного приложения.
В начало файла вставьте следующие строки кода препроцессора:
- #if defined(_DEBUG) && !defined(DEBUG_AUTOCAD)
- #define _DEBUG_WAS_DEFINED
- #undef _DEBUG
- #define NDEBUG
- #endif
В конце файла STDAFX.H добавьте следующие строки:
- //----- в конец файла STDAFX.H
- //----- Определяем символ _DEBUG если он был ранее определен перед включением
- //----- не-MFC файлов заголовков.
- #ifdef _DEBUG_WAS_DEFINED
- #undef NDEBUG
- #define _DEBUG
- #undef _DEBUG_WAS_DEFINED
- #endif
Это позволит отлаживать ваш код и при этом использовать release-версии MFC библиотек.
Если вы используете ObjectARX Wizard для создания приложения в Visual Studio, это всебудет сделано автоматически.
Вы можете убрать совсем определение _DEBUG из установок проекта, но при этом учтите, что вы возможно удаляете часть отладочного кода.
Обсуждение: http://adn-cis.org/forum/index.php?topic=626
Опубликовано 21.03.2014