моя компания недавно обновилась с VS2005 до VS2010. У нас есть огромный проект, который использует много модулей, которые статически связаны в исполняемый файл. Но в VS2010 есть некоторые проблемы со связыванием.
Чтобы объяснить нашу проблему, мы создали минимальный пример проекта, который составлен так, как показано на этом рисунке:
Существует приложение, использующее одну функцию из библиотеки A. Библиотека A вызывает одну функцию из каждой библиотеки B и библиотеки C. Эти две библиотеки вызывают функцию, предоставляемую библиотекой D.
Для Exe 1 в Framework and References мы устанавливаем все на false за исключением Зависимости библиотеки ссылок , которая установлена в true. Добавлена только ссылка на библиотека A . Для каждой из библиотек все настройки имеют значение false. Библиотека A получает ссылки только на B и C , а также на эти две ссылки на получение только D . Библиотека D не имеет ссылок.
При сборке приложения оно работает без проблем. Приложение замечает, что библиотека A использует библиотеки B и C, которые используют библиотеку D, поэтому оно знает, что должно также связать эти библиотеки. LIBS без проблем связаны в exe.
Теперь мы что-то изменим, скажем, в библиотеке D . Просто небольшая разница, только одна буква. Теперь мы пытаемся снова построить приложение, оно замечает изменение и перекомпилирует библиотеку D , но: оно больше не связывается с ним. В результате возникают ошибки связывания в библиотеке B и C , поскольку они используют библиотеку D . Сначала нужно выполнить Перестроить , чтобы заставить завершить строительство и , а затем , все снова связано.
Это происходит как для минимального примера, так и для нашего основного проекта. Конечно, мы можем добавить каждую из библиотек в качестве дополнительной зависимости для exe, но было бы неплохо, если бы она работала так же, как и при первом создании проекта, и продолжала работать после изменений в коде. Мы заметили, что при установке Использовать входы зависимостей библиотеки до true , он снова работает, но затем он связывает не файлы * .lib, а файлы * .obj, который не является что мы хотим, конечно.
Кто-нибудь сталкивался с подобным опытом или у кого-нибудь есть решение этой проблемы? Это глючное поведение VS2010?
ТИА.
p.s .: Все библиотеки и исполняемые файлы являются родными C ++.
Редактировать: (Временное решение взято с этого сайта )
В файле %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 без добавления их вручную в качестве зависимостей в исполняемый файл.
Похоже, это скорее обходной путь, чем решение, может быть, есть правильный способ добиться неявного связывания.