Visual Studio: копировать зависимые библиотеки DLL в целевую папку - PullRequest
10 голосов
/ 10 февраля 2011

Я понимаю, что этот вопрос задавался ранее - но ни один из ответов не относится к моему конкретному случаю:

  • У меня есть решение, содержащее нативный проект C ++ EXE, который, в свою очередь,зависит от 40+ собственных проектов C ++ DLL (в том же решении).

  • Проект EXE имеет обычную Debug , Release Profile ) конфигурацию, но так как они того же источникакодовая база используется для построения трех различных приложений (скажем, A1 , A2 и A3 ).Кроме того, он нацелен на x32 и x64, то есть в общей сложности 3 x 3 x 2 = 18 конфигураций проекта.

  • Проекты DLL совместно используются всеми тремя целевыми приложениями, поэтому естьтолько 3 ( Отладка , Выпуск , Профиль ) раз 2 (x32, x64) = 6 конфигураций.

  • Поскольку проект EXE зависит от библиотек DLL, он должен копировать соответствующие выходные данные проектов DLL в свою целевую папку (или подпапку) при каждом изменении.

Как бы выобрабатывать обновление библиотек DLL?

  • Действие после сборки в каждом проекте DLL не работает (хорошо), так как оно должно было бы скопировать DLL в соответствующую выходную папку А1 , А2 и А3 .Любое изменение в выходной папке приводит к необходимости изменения действия после сборки в каждом из 50 проектов DLL.

  • В настоящее время я добавил сами библиотеки DLL в качестве элементов проекта в проект EXE,и настроил пользовательский инструмент для сборки, чтобы скопировать его в выходную папку.Но для этого требуется, чтобы я добавлял каждую DLL 6 раз, так что в итоге я получаю 6 x 50 = 300 DLL!

Что мне действительно нужно, так это что-то вроде опции Copy Local, которая, к сожалению, толькоработает сборками.Предлагаете ли вы решение для упрощения этой сборки?

1 Ответ

5 голосов
/ 10 февраля 2011

Что бы я сделал, это поместил все библиотеки DLL в одну папку (специфичную для Debug / Release и т. Д.) И скопировал их обратно в соответствующую выходную папку вашего EXE-файла.

Это можно сделать втолько два действия:

  • Установить выходной каталог всех библиотек DLL в папку, такую ​​как $(ConfigurationName)_$(PlatformShortName)

    • выбрать все проекты DLL
    • вправо-click -> propoerties
    • выбрать все конфигурации и все платформы
    • установить выходной каталог
  • Добавить действие после сборки кПроект EXE, общий для всех конфигураций, который копирует $(ConfigurationName)_$(PlatformShortName)\*.dll в $(TargetDir)

EDIT

Во втором шаге возникла проблема, поскольку$(ConfigurationName) вашего EXE-файла не совпадает с вашими проектами DLL.Не уверен, но, возможно, у вас может быть способ вывести соответствующую конфигурацию, чтобы все еще иметь одно событие после сборки для всех ваших 18 конфигов.Это может быть новый вопрос SO:)

...