LF>Не ужто баг очередной? LF>попробуйте плиз ктото у себя LF>1)Создаем ATL проект LF>2)в опциях убираем аттрибуты LF>3)в опциях включаем поддержку MFC LF>4)в опциях включаем Allow merging of proxy/stub code LF>компилим проект. ВСЕ ок LF>Закрываем проект. Можно выйти из студии. LF>Открываем опять этот проект, и делаем Rebuild Solution LF>получаем ошибки LF>
Да, это баг в библиотеке MFC (или в CRT ) По, крайней мере, это справедливо для 7.1, на других версиях не смотрел. Суть проблемы заключается в следующем: библиотека CRT в числе прочих содержит реализацию функции DllMain в модуле dllmain.c если проект, использующий CRT, не реализует свою функцию DllMain, то будет использоваться реализация по умолчанию из CRT. Благодаря этому можно, например, создать проект Windows DLL и не реализовывать функцию DllMain. Если в одном из модулей проекта есть реализация DllMain, то на этапе сборки должна была бы появиться ошибка о "multiply defined symbols DllMain", но ее не возникает благодаря особенностям работы линковщика. Если он обнаруживает повторное определение символа в obj файле, входящем в lib, то пытается полностью исключить этот obj файл со всеми функциями, в нем находящимися. Если это удается сделать, то дальнейшая сборка выполняется нормально. В CRT в модуле dllmain.c кроме реализации DllMain больше нет никаких символов, поэтому если у линковщика уже есть определение для DllMain, то он просто выбрасывает dllmain.obj во время сборки. Если проект использует MFC, то к нему подключается библиотека mfcs71d.lib (mfcs71.lib), в одном из объектных файлов которой также есть определение для DllMain — dllmodul.cpp. Проблема заключатеся в том, что помимо DllMain в этом же модуле находятся еще несколько функций и поэтому линковщик, встречая повторную реализацию для DllMain, уже не может исключить dllmodul.obj и в итоге появляется ошибка "multiply defined symbols DllMain" (кстати, это даже в чем то хорошо, потому что если проект бы собрался — то использовалась бы не DllMain из MFC, а заглушка из CRT, что привело бы скроее всего к проблемам) Интересный побочный эффект этой проблемы связан с тем, что проявляться она будет только при определенном порядке просмотра lib'ов линковщиком. Если первой обрабатывается mfcs71 (а так как правило и просиходит), то встречая позднее DllMain в CRT линковщик спокойно выбрасывает dllmain.obj и сборка завершается без ошибок. Если же первой будет обрабатываться msvcrt, то встретив позднее DllMain в mfcs71, линковщик уже не сможет исключить dllmodul.obj из процесса сборки и в итоге проект не соберется. Так происходит в ситуации, которую ты описал. Сразу же после создания проекта ATL+MFC+Merge proxy/stub добавляется модуль "dlldatax.c", который зависит от библиотеки mscvrt, но он обрабатывается последним и при сборке проекта линковщика все проходит на ура. При последующих сборках он уже обрабатывается первым и, как результат, первой обрабатывается mscvrt.lib и появляется ошибка. Могу посоветовать 2 вещи: — не использовать merge proxy/stub и не подключать к проекту исходников C — прописать в Additional Dependencies явно mfcs71d.lib (mfcs71.lib) |