Ошибка компоновщика множественного определения C ++ с уровня оптимизации - PullRequest
2 голосов
/ 25 января 2012

Для начала я понимаю, что здесь есть несколько вопросов об ошибках определения, но меня это озадачивает.

У меня есть модуль, который я разрабатываю, и я строю в отладке, т.е. -DDEBUG -g -O0. Теперь, когда я хочу сделать релиз -DNDEBUG -Os, я создаю и получаю ошибки компоновщика для нескольких определений нескольких определений STL, включая

  • std :: basic_ios> :: basic_ios ()
  • станд :: __ throw_bad_alloc ()
  • std :: string :: assign (char const *) v
  • * прочее * 1014

Я проверил свой проект, все заголовочные файлы имеют защиту #ifndef, и единственный код в заголовочных файлах объявляется встроенным.

Обдумывая, я обнаружил, что могу компилировать с -DNDEBUG -O0, но не с любым уровнем оптимизации. Процесс сборки включает в себя создание около 2 дюжин объектов, а затем их объединение. Зачем оптимизация убивает компоновщик? и как я могу это исправить?

Здание с TDM MinGW 4.6.1.

1 Ответ

0 голосов
/ 25 января 2012

Эта проблема также дублируется при включении файлов отладки MFC в режиме выпуска или наоборот. Здесь может быть такая же проблема - это просто дикое предположение.

Чтобы выяснить причину, которую я предполагаю, сделайте следующее:

#ifdef _DEBUG
#define DEBUG_WAS_DEFINED
//include files that give you multiple definitions here
#endif

//.....
//.....
//rest of code/includes

#ifdef DEBUG_WAS_DEFINED
#undef DEBUG_WAS_DEFINED
#define _DEBUG  //revert to previous state
#endif

Возможно, вы захотите взглянуть по этой ссылке: http://www.flounder.com/debug_release.htm, раздел о смешанных DLL.

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