У меня есть досадная проблема, которую я мог бы как-то обойти, но с другой стороны, я бы предпочел быть на вершине и понять, что именно происходит, так как похоже, что эти вещи действительно здесь, чтобы остаться.
Вот история: у меня есть простое приложение OpenGL, которое прекрасно работает: никогда не возникает серьезных проблем при компиляции, компоновке или запуске. Теперь я решил попробовать перенести некоторые из более интенсивных вычислений в рабочий поток, чтобы сделать GUI еще более отзывчивым - конечно, с помощью Boost.Thread.
Короче говоря, если я добавлю следующий фрагмент в начало моего .cpp файла:
#include <boost/thread/thread.hpp>
void dummyThreadFun() { while (1); }
boost::thread p(dummyThreadFun);
, затем я начинаю получать сообщение «Это приложение не удалось запустить, так как MSVCP90.dll не был найден» при попытке запустить сборку Debug. (Режим разблокировки работает нормально.)
Теперь, глядя на исполняемый файл, использующий Dependency Walker, который также не находит эту DLL (что, как я полагаю, ожидаемо), я увидел, что мы ищем ее, чтобы иметь возможность вызывать следующие функции:
?max@?$numeric_limits@K@std@@SAKXZ
?max@?$numeric_limits@_J@std@@SA_JXZ
?min@?$numeric_limits@K@std@@SAKXZ
?min@?$numeric_limits@_J@std@@SA_JXZ
Затем я попытался преобразовать каждый экземпляр min
и max
для использования макросов, но, вероятно, не смог найти все ссылки на них, так как это не помогло. (Я использую некоторые внешние библиотеки, для которых у меня нет доступного исходного кода. Но даже если бы я мог сделать это - я не думаю, что это действительно правильный путь.)
Итак, мои вопросы - я думаю, - это:
- Почему мы ищем не отладочную DLL, хотя работаем с отладочной сборкой?
- Как правильно решить проблему? Или даже быстрый и грязный?
У меня это было сначала в довольно ванильной установке Visual Studio 2008. Затем попытался установить Feature Pack и SP1, но они тоже не помогли. Конечно, также пытался восстановить несколько раз.
Я использую готовые двоичные файлы для Boost (v1.36.0). Это не первый раз, когда я использую Boost в этом проекте, но это может быть первый раз, когда я использую деталь, основанную на отдельном источнике.
Отключение инкрементных ссылок не помогает. Тот факт, что программа OpenGL, похоже, тоже не актуален - у меня возникла похожая проблема при добавлении тех же трех строк кода в простую консольную программу (но там она жаловалась на MSVCR90.dll и _mkdir
, и когда я заменил последний на boost::create_directory
, проблема ушла !!). И действительно, просто удаляя или добавляя эти три строки, программа работает нормально или вообще не запускается, соответственно.
Не могу сказать, что понимаю «бок о бок» (даже не знаю, связано ли это с этим, но сейчас я так предполагаю), и, честно говоря, я тоже не очень заинтересован - пока Я могу просто собрать, отладить и развернуть свое приложение ...
Редактировать 1: При попытке создать урезанный пример, который в любом случае воспроизводит проблему, я обнаружил, что проблема связана с Spread Toolkit , использование что является общим фактором для всех моих программ, имеющих эту проблему. (Однако у меня никогда не было этого до того, как я начал ссылаться в Boost.)
Теперь я разработал минимальную программу, которая позволяет мне воспроизвести проблему. Он состоит из двух блоков компиляции, A.cpp и B.cpp.
a.cpp:
#include "sp.h"
int main(int argc, char* argv[])
{
mailbox mbox = -1;
SP_join(mbox, "foo");
return 0;
}
B.cpp:
#include <boost/filesystem.hpp>
Некоторые наблюдения:
- Если я закомментирую строку
SP_join
файла A.cpp, проблема исчезнет.
- Если я закомментирую одну строку B.cpp, проблема исчезнет.
- Если я переместлю или скопирую одну строку B.cpp в начало или конец A.cpp, проблема исчезнет.
(В сценариях 2 и 3 происходит сбой программы при вызове SP_join
, но это только потому, что почтовый ящик недействителен ... это не имеет никакого отношения к рассматриваемой проблеме.)
Кроме того, ядро библиотеки Spread связано, и это, безусловно, часть ответа на мой вопрос # 1, поскольку в моей системе нет отладочной сборки этой библиотеки.
CurrenВ общем, я пытаюсь придумать что-то, что позволило бы воспроизвести проблему в другой среде. (Даже если я буду очень удивлен, если это действительно будет повторяться за пределами моего помещения ...)
Редактировать 2: Хорошо, поэтому здесь теперь у нас есть пакет, с помощью которого я смог воспроизвести проблему на почти ванильной установке WinXP32 + VS2008 + Boost 1.36.0 (по-прежнему предварительно собранные двоичные файлы от BoostPro Computing ).
Виновником, безусловно, является библиотека Spread, моя сборка которой почему-то требует довольно архаичной версии STLPort для MSVC 6 ! Тем не менее, я все еще нахожу симптомы довольно забавными. Кроме того, было бы неплохо услышать, если вы действительно можете воспроизвести проблему - в том числе сценарии 1-3 выше. Упаковка довольно маленькая и должна содержать все необходимые кусочки.
Как выяснилось, проблема на самом деле не имела ничего общего с Boost. В частности, поскольку в этом примере теперь используется библиотека Boost Filesystem. Кроме того, теперь он жалуется на MSVCR90.dll, а не на P, как ранее.