Проблема статической компоновки VS2010

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

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

minimal library example

Существует приложение, использующее одну функцию из библиотеки 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.

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

10
задан Exa 22 June 2011 в 12:27
поделиться