моя компания недавно перешла с VS2005 на VS2010. У нас есть огромный проект, в котором используется множество модулей, которые статически связаны с exe. Но, похоже, есть некоторые проблемы со связыванием в VS2010.
Чтобы объяснить нашу проблему, мы создали минимальный пример проекта, который составлен, как показано на этом рисунке:
Существует приложение, использующее одну функцию из библиотеки A .Библиотека A вызывает одну функцию каждой библиотеки B и библиотеки C. Эти две библиотеки вызывают функцию, предоставленную библиотекой D.
Для Exe 1 в разделе Framework and References мы устанавливаем все на false за исключением Зависимости библиотеки ссылок , для которого установлено значение true. Единственная добавленная ссылка - это ссылка на библиотеку A . Для каждой из библиотек все настройки имеют значение false. Библиотека A получает ссылки только на B и C , а также эти два получают ссылки только на D . Библиотека D не имеет ссылок.
При сборке приложения работает без проблем. Приложение замечает, что библиотека A использует библиотеки B и C, которые используют библиотеку D, поэтому оно знает, что также необходимо связать эти библиотеки. Библиотеки без проблем подключаются к exe.
Теперь мы что-то меняем, скажем, в библиотеке D . Небольшая разница, всего одна буква. Теперь мы пытаемся собрать приложение снова, оно замечает изменение и повторно компилирует библиотеку D , но: Оно больше не ссылается на него. Результатом являются ошибки связывания в библиотеке B и C , потому что они используют библиотеку D . Сначала мы должны запустить Rebuild , чтобы принудительно выполнить все здание, а затем , затем , все снова будет связано.
Это происходит как для минимального примера, так и для нашего основного проекта. . Конечно, мы можем добавить каждую из библиотек в качестве дополнительной зависимости для exe, но было бы хорошо, если бы она работала так же, как при первой сборке проекта, и продолжала работать после изменений в коде. Мы заметили, что при установке для параметра Использовать входы зависимостей библиотеки значение true , он снова работает, но тогда он связывает не файлы * .lib, а файлы * .obj, которые не являются то, что мы хотим, конечно.
Кто-нибудь имел аналогичный опыт или у кого-нибудь есть решение этой проблемы? Это ошибочное поведение VS2010?
TIA.
ps: Все библиотеки и исполняемые файлы являются встроенными в C ++.
Изменить: (Обходное решение взято с этого сайта )
В файле % ProgramsFile % \ MSBuild \ Microsoft.cpp \ v4.0 \ Microsoft.CPPBuild.Targets
есть строка
. Если вы измените эту строку на
, связывание работает правильно и все необходимые библиотеки связаны неявно. В выводе компоновщика отображается не только lib_a.lib, но и все другие связанные библиотеки, lib_b, lib_c, lib_d без их добавления вручную в качестве зависимостей к exe.
Это скорее обходной путь, чем решение, возможно, есть правильный способ достижения неявной ссылки.