ADN Open CIS
Сообщество программистов Autodesk в СНГ

21/03/2014

Необходимость использования 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-компилированного приложения.

В начало файла вставьте следующие строки кода препроцессора:

Код - C++: [Выделить]
  1. #if defined(_DEBUG) && !defined(DEBUG_AUTOCAD)
  2.    #define _DEBUG_WAS_DEFINED
  3.    #undef _DEBUG
  4.    #define NDEBUG
  5. #endif

В конце файла STDAFX.H добавьте следующие строки:

Код - C++: [Выделить]
  1. //----- в конец файла STDAFX.H
  2. //----- Определяем символ _DEBUG если он был ранее определен перед включением
  3. //----- не-MFC файлов заголовков.
  4. #ifdef _DEBUG_WAS_DEFINED
  5.   #undef NDEBUG
  6.   #define _DEBUG
  7.   #undef _DEBUG_WAS_DEFINED
  8. #endif

Это позволит отлаживать ваш код и при этом использовать release-версии MFC библиотек.

Если вы используете ObjectARX Wizard для создания приложения в Visual Studio, это всебудет сделано автоматически.

Вы можете убрать совсем определение _DEBUG из установок проекта, но при этом учтите, что вы возможно удаляете часть отладочного кода.

Источник: http://adndevblog.typepad.com/autocad/2012/12/you-must-link-the-release-version-of-the-mfccrt-libraries-when-compiling-objectarx-applications.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=626

Опубликовано 21.03.2014