моя компания недавно обновилась от VS2005 до VS2010. У нас есть огромный проект, который использует множество модулей, которые статически связаны с exe. Но, похоже, есть некоторые проблемы со связью в VS2010.
Чтобы объяснить нашу проблему, мы создали минимальный примерный проект, который составлен, как показано на этом рисунке:
Существует приложение, использующее одну функцию из библиотеки A. Библиотека A вызывает одну функцию из каждой библиотеки B и библиотеки C. Эти две библиотеки вызывают функцию, предоставляемую библиотекой D.
Для Exe 1 в рамках Framework и ссылок мы устанавливаем все значение в false, за исключением зависимостей библиотеки библиотек, для которых установлено значение true. Добавлена только ссылка на библиотеку A. Для каждой из библиотек все настройки имеют значение false. Библиотека A получает ссылки только на B и C, а также те, кто получает ссылки только на D. Библиотека D не имеет ссылок.
При создании приложения он работает без проблем. Приложение замечает, что библиотека A использует библиотеки B и C, которые используют библиотеку D, поэтому она знает, что она также должна связывать эти библиотеки. Libs связаны с exe без проблем.
Теперь мы что-то изменим, скажем, в библиотеке D. Просто небольшая разница, только одно письмо. Теперь мы пытаемся снова создать приложение, оно замечает изменение и перекомпилирует библиотеку D, но: оно больше не ссылается на него. В результате связывание ошибок в библиотеке B и C, потому что они используют библиотеку D. Сначала мы должны запустить Rebuild, чтобы принудительно создать полное здание и , затем все снова связано.
Это происходит как для минимального примера, так и для нашего основного проекта. Конечно, мы можем добавить каждую из библиотек в качестве дополнительной зависимости для exe, но было бы неплохо, если бы она работала так же, как при создании проекта в первый раз, и продолжала работать после изменений кода. Мы заметили, что при настройке Use Library Dependency Inputs на true, что он работает снова, но тогда он не связывает файлы *.lib, а файлы *.obj, которые мы не хотим, конечно.
Кто-нибудь сделал подобный опыт или у кого-нибудь есть решение этой проблемы? Является ли это ошибкой поведения VS2010?
ТИА.
p.s.: Все библиотеки и исполняемые файлы являются родными С++.
Изменить: (Обходное решение взято из этот сайт)
В файле %ProgramsFile%\MSBuild\Microsoft.cpp\v4.0\Microsoft.CPPBuild.Targets
есть строка
<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)" DependsOnTargets="$(CommonBuildOnlyTargets)">
Если вы измените эту строку на
<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)" DependsOnTargets="$(CommonBuildOnlyTargets);ResolvedLinkLib">
ссылка работает правильно, и все необходимые библиотеки связаны с неявным образом. Выход компоновщика не только отображает lib_a.lib, но и все другие запущенные libs, lib_b, lib_c, lib_d, не добавляя их вручную в зависимости от exe.
Это, кажется, более обходное решение, а затем решение, возможно, существует правильный способ достижения неявной привязки.