Запретить смешивание библиотек отладки и выпуска - PullRequest
6 голосов
/ 12 октября 2011

Как разработчик библиотеки, я хочу запретить пользователям моей библиотеки (Windows, MSVC) ссылаться на неправильную конфигурацию (не связывать библиотеку отладки с их программами выпуска и наоборот).

Можно ли предупредить пользователя во время компиляции о том, что он (-ы) должен ссылаться на правильную конфигурацию библиотеки?

EDIT

Должны быть доступны как отладочная, так и выпускная версии, чтобы позволить разработчикам Windows отлаживать свои приложения. Поэтому должны быть доступны как отладочная, так и выпускная версии моей библиотеки.

Я задаю этот вопрос, потому что большая часть поддержки начинающих разработчиков Windows вызвана тем, что они смешивают код отладки и выпуска и получают трудные для отладки ошибки времени выполнения.

Ответы [ 4 ]

4 голосов
/ 12 октября 2011

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

Несмотря на это, я вижу способ сделать это, экспортировав несколько символов для каждой конфигурации:

//header:
class DLLIMPEXP Dummy
{
   static int x;
   virtual void dummy();
}
//cpp
#ifdef DEBUG
int Dummy::x = 0;
void Dummy::dummy()
{
}
#endif

Как видите, ваш символ будет экспортироваться только в том случае, если ваш модуль скомпилирован в DEBUG. Попытка связать библиотеку в режиме выпуска из третьего модуля приведет к ошибке компоновщика. Вы можете иметь что-то подобное для обратного случая.

Я не советую вам делать это, я скорее задокументирую это или распространю только релизную версию моего модуля.

1 голос
/ 12 октября 2011

Здесь есть два разных аспекта:

  • проблема несовместимости
  • проблема производительности

Если это вопрос производительности, то выбор должен быть за ними, они могут захотеть отладить.

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

#ifdef NDEBUG
  namespace project {
#else
  namespace project { namespace debug {
#endif

// content

#ifdef NDEBUG
  }
#else
  }
  using namespace debug;
  }
#endif

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

Тем не менее, я призываю вас зарезервировать это для очень определенного набора классов (это тяжело).

Обычно должна быть возможность предоставлять совместимые интерфейсы в режимах отладки и выпуска, чтобы клиенты могли выполнять горячую замену во время загрузки.

0 голосов
/ 12 октября 2011

Добавьте этот код в заголовок вашей библиотеки

Различные имена для разных типов

#ifndef _DLL
// C runtime as dll
#  ifdef _DEBUG
#    pragma comment(lib, "MyLibD.lib")
#  else
#    pragma comment(lib, "MyLib.lib")
#  endif
#else
// C runtime statically
#  ifdef _DEBUG
#    pragma comment(lib, "MyLibSD.lib")
#  else
#    pragma comment(lib, "MyLibS.lib")
#  endif
#endif

Различные пути для разных типов

#ifndef _DLL
// C runtime as dll
#  ifdef _DEBUG
#    pragma comment(lib, "debug/dynamic/MyLib.lib")
#  else
#    pragma comment(lib, "release/dynamic/MyLib.lib")
#  endif
#else
// C runtime statically
#  ifdef _DEBUG
#    pragma comment(lib, "debug/static/MyLib.lib")
#  else
#    pragma comment(lib, "debug/static/MyLib.lib")
#  endif
#endif

после этого вам нужно только добавить путь к lib к вашему компоновщику, и вы больше не сможете его перепутать.

0 голосов
/ 12 октября 2011

Вы можете добавить директиву #warning, но я настоятельно не рекомендую вам это делать. Вы должны лучше доставить в другую версию вашей библиотеки с двумя разными именами.

Вот еще один совет для вашей проблемы:

myLib.h  // Release Version
myLibd.h // Debug Version

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

Вы также можете добавить заметку в README или INSTALL, большинство пользователей читают ее, когда хотят установить связь в MSVC.

Вы также можете проверить наличие значений макросов DEBUG и NDEBUG в вашей программе. (С утверждением во время инициализации вашей библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...