Как я могу автоматически связать в зависимости зависимости в VS 2010?

Я использую Visual Studio 2010 с большим количеством файлов проектов и решений. Но теперь я нахожусь в аду зависимости с ProjectReferences:

  • проект Simple производит статическую библиотеку.
  • проектов Foo а также Bar зависит от Simple, а также производить статические библиотеки.
  • проект Module зависит от Foo и производит DLL.
  • проект Module2 зависит от Bar и производит DLL.

Итак, дерево зависимостей выглядит так:

                Simple
                  |
     ____________/ \__________
     |                        |
    Foo                      Bar
     |                        |
   Module                   Module2

С ProjectReferences, Я могу сделать Module зависит от Foo и автоматически связывать Foo.lib, Это отлично работает.

Но есть ли способ для Module автоматически связать в Simple.lib?

Кажется, это должно быть возможно. Module зависит от Foo, который зависит от SimpleТаким образом, похоже, что он должен иметь возможность "ссылки в выводе моих ссылок и ссылок моих ссылок". Но я не могу найти ничего, что позволило бы мне это сделать.

Опция "Зависимости библиотеки ссылок" не делает этого. Это только ссылки в Foo.lib, и тогда я получаю ошибку связывания с неразрешенными внешними символами (символами, которые определены в Simple.lib).

Установка "Зависимости библиотеки ссылок" в true для Foo->Simple а также Bar->Simple Сначала кажется, что ссылки работают, пока у вас нет проекта, который использует оба Foo а также Bar, Эта настройка на самом деле встраивает Simple.lib Внутри Foo.lib а также Bar.lib, а затем вы получите "символ уже определен" ошибки, если вы попытаетесь использовать оба Foo.lib а также Bar.lib, И это правильная ошибка - я на самом деле не хочу ставить Simple.lib внутри любой другой библиотеки.

Я могу добавить ProjectReferece от Module в Simple, но это утомительно, чтобы установить в каждом проекте, который использует Fooи это нарушает инкапсуляцию Foo, Module не нужно знать о Simple, Очевидно, что компоновщик должен знать о Simple, но он должен быть в состоянии понять это, следуя ProjectReferences.

Вот почему это важно: Предположим, что во время обслуживания создается новый проект: Basic, который создает статическую библиотеку, и Simple зависит от Basic, Теперь мы должны обновить каждый проект, который имеет ProjectReference в Simple напрямую или через другой ProjectReference (в этом примере это только два проекта, Module а также Module2, но на самом деле это десятки). Это утомительно.

tl; dr Есть ли способ автоматически связать статические библиотеки моих зависимостей?

1 ответ

Решение

По-видимому, это ошибка в Visual Studio 2010: https://connect.microsoft.com/VisualStudio/feedback/details/638534/unresolved-externals-when-build-a-vc-project-with-chained-static-lib-dependencies

К сожалению, Microsoft закрыла ошибку как "исправленную", что не совсем так. Это скорее обходной путь, но это не то, что я бы посчитал настоящим решением. (Реальное исправление - это исправление или пакет обновления, а не то, что нужно настраивать вручную на каждой машине).

"Исправление" заключается в следующем:

изменять %ProgramFiles(x86)%\MSBuild\Microsoft.cpp\v4.0\Microsoft.CPPBuild.TargetsИ измените строку:

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets)">

к

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets);ResolvedLinkLib">

Итак, просто добавьте часть ResolvedLinkLib в этот файл. Тогда VS будет ссылаться в зависимости зависимостей.

Другие вопросы по тегам