Visual Studio C ++ Многопоточная DLL отладки против многопоточной DLL

Один из моих проектов работает только с DLL отладки, а не с DLL без отладки.

  1. Какие проблемы возникают при выпуске проекта в настройках Debug DLL? Например, потеряны ли какие-то оптимизации?

  2. Как отладить этот проект, установив для отладочной версии значение DLL без отладки? Я попытался сделать это и даже изменить _Debug на NDEBUG, но в любом случае это дает мне ту же ошибку:

    неразрешенный внешний символ imp _CrtDbgReportW, указанный в функции "public: class std :: basic_string, class std :: allocator> const & __thiscall std :: _ Vector_const_iterator, class std :: allocator>, class std :: allocator , class std :: allocator>>>> :: operator * (void) const "(?? D? $ _ Vector_const_iterator @ V? $ _ Vector_val @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ распределитель @ D @ 2 @@ std @@ V? $ allocator @ V? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ std @@@ 2 @@ std @@ @ std @@ QBEABV? $ basic_string @ DU? $ char_traits @ D @ std @@ V? $ allocator @ D @ 2 @@ 1 @ XZ)

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


person pete    schedule 23.01.2012    source источник
comment
Исправьте ошибку. Вероятно, он все еще присутствует в отладочной версии, но вы просто еще не видели его проявления.   -  person David Heffernan    schedule 23.01.2012
comment
Если вы компилируете свой проект с отладкой, вам необходимо связать DLL отладки, в противном случае вам нужно связать DLL выпуска. Вы не можете смешивать и сочетать. Кроме того, не изменяйте _DEBUG самостоятельно.   -  person Mooing Duck    schedule 23.01.2012
comment
@David - я сомневаюсь, что этот символ должен существовать только в отладочных версиях кода. Я подозреваю, что сборка выпуска настроена неправильно, поэтому она пытается скомпилировать только символы отладки ...   -  person Benj    schedule 23.01.2012
comment
comment
Что ж, я все еще ищу ответ на любой из двух вопросов, пожалуйста; объясните неудачу выпуска с отладкой и / или научите меня, как отлаживать код, сгенерированный не-отладочными настройками компилятора. Благодарность   -  person pete    schedule 23.01.2012
comment
DLL отладки не распространяется. Вы не можете выпустить сборку, сделанную с его использованием.   -  person Roger Lipscombe    schedule 23.01.2012
comment
@Peter - Выпуск отладочной сборки обычно не вариант, потому что вам также придется поставлять MS Debug Runtime с вашим двоичным файлом, а этого, вероятно, нет в вашем контракте на обслуживание с Microsoft. Кроме того, сборка не будет оптимизирована и, вероятно, будет работать на порядок медленнее, чем ваша сборка выпуска ...   -  person Benj    schedule 23.01.2012
comment
Ничто не мешает вам генерировать символы отладки в режиме выпуска и запускать этот исполняемый файл под отладчиком. Просто оптимизированный код понять немного сложнее.   -  person Bo Persson    schedule 23.01.2012
comment
@Benj О, я предположил, что это ошибка времени выполнения, а не ошибка времени компиляции.   -  person David Heffernan    schedule 23.01.2012
comment
@BoPersson - Как он собирается исправить ошибку компоновщика под отладчиком? Также это не вопрос генерации отладочных символов. Проблема в том, что рассматриваемая функция является только частью отладочной CRT и, следовательно, не может быть связана в режиме выпуска.   -  person Benj    schedule 24.01.2012


Ответы (2)


Похоже, вы либо определяете _DEBUG в конфигурации выпуска вашей сборки, либо напрямую вызываете _CrtDbgReport (), не заключая его в #ifdef _DEBUG.

http://msdn.microsoft.com/en-us/library/8hyw4sy7%28v=vs.80%29.aspx

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

Эту функцию следует вызывать только в отладочных сборках ...

Отвечая на другие ваши вопросы, выпуск отладочной сборки обычно не является вариантом, потому что вам также придется поставлять MS Debug Runtime с вашим двоичным файлом, а этого не будет в вашем контракте на обслуживание с Microsoft. Кроме того, сборка не будет оптимизирована и, вероятно, будет работать на порядок медленнее, чем ваша сборка выпуска ...

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

#define _DEBUG

#include "windows.h"
#include <crtdbg.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _CrtDbgReportW(_CRT_ASSERT, NULL, NULL, L"some module", NULL);
    return 0;
}
person Benj    schedule 23.01.2012

Я только что испытал похожий симптом («мои проекты работают только с DLL отладки, а не с DLL без отладки»). В отличие от вас, я не получал никаких сообщений об ошибках. Моя программа не подавала никаких признаков жизни ...

Моя программа (надстройка (BHO) для Internet Explorer) нормально работала в Windows XP, Windows 7 и Windows 8, но не в Windows 8.1. Я свел проблему к различию в библиотеке времени выполнения. В моем .vcxproj файле были обнаружены следующие теги:

<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> (Debug build)
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> (Release build)

Я запустил Process Monitor для обеих сборок и обнаружил запись для " MSVCP100.dll "с результатом" NAME_NOT_FOUND "См. Снимок экрана ниже. Эта ошибка возникла только в сборке Release.

MSVCP100.dll является частью среды выполнения Visual C ++ 2010, которая, похоже, не устанавливается по умолчанию в Windows 8.1 (Windows Blue). Можно загрузить и установить VC2010 от Microsoft, 32-битную версию или 64-разрядной версии. После установки среды выполнения проблема была решена, и мое расширение снова работало.

Скриншот Procmon

procmon

person Rob W    schedule 22.07.2013