Visual Studio C ++ "Многопоточная DLL отладки" и "Многопоточная DLL" - PullRequest
1 голос
/ 23 января 2012

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Похоже, вы либо определяете _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;
}
0 голосов
/ 22 июля 2013

Я только что столкнулся с подобным симптомом («мои проекты работают только с отладочной 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" См. Скриншот ниже .Эта ошибка возникала только в сборке выпуска.

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

Снимок экрана Procmon

procmon

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