Как я могу автоматически связать в зависимости зависимости в 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 будет ссылаться в зависимости зависимостей.