Одна интересная вещь - если вы переключите число потоков компиляции на 1, это не произойдет (может быть, какое-то состояние гонки в Visual Studio?).

омпания недавно обновилась с VS2005 до VS2010. У нас есть огромный проект, который использует много модулей, которые статически связаны в исполняемый файл. Но, похоже, есть некоторые проблемы со связыванием в VS2010.

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

Существует приложение, использующее одну функцию из библиотеки A. Библиотека A вызывает одну функцию из каждой библиотеки B и библиотеки C. Эти две библиотеки вызывают функцию, предоставляемую библиотекой D.

ЗаExe 1 подРамки и ссылки мы установили все наложный кромеЗависимости библиотеки ссылок который установлен в true. Единственная добавленная ссылка - ссылка набиблиотека А, Для каждой из библиотек все настройки имеют значение false. Библиотека A получает ссылки только наB а такжеCа также эти двое получают ссылки наD только.Библиотека D не имеет ссылок.

При сборке приложения работает без проблем. Приложение замечает, что библиотека A использует библиотеки B и C, которые используют библиотеку D, поэтому оно знает, что должно также связать эти библиотеки. LIBS без проблем связаны в exe.

Теперь мы что-то изменим, скажем,библиотека D, Просто небольшая разница, только одна буква. Теперь мы пытаемся собрать приложение снова, оно замечает изменения и перекомпилируетбиблиотека D, но: это больше не связано с этим. Результатом являются ссылки на ошибки вбиблиотека B а такжеCпотому что они используютбиблиотека D, Мы должны бежатьперестраивать во-первых, чтобы заставить полное здание итогда все снова связано.

Это происходит как для минимального примера, так и для нашего основного проекта. Конечно, мы можем добавить каждую из библиотек в качестве дополнительной зависимости для exe, но было бы неплохо, если бы она работала так же, как и при первом создании проекта, и продолжала работать после изменений в коде. Мы заметили, что при настройкеИспользовать входы зависимостей библиотеки вправдачто он снова работает, но потом он не связывает файлы * .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 без добавления их вручную в качестве зависимостей в исполняемый файл.

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

Ответы на вопрос(4)

Ваш ответ на вопрос