Visual Studio: файлы, зависимые от копирования, в целевой папке

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

  • У меня есть решение, содержащее собственный проект С++ EXE, который, в свою очередь, зависит от 40 + родных проектов С++ 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 в соответствующую выходную папку A1, A2 и A3. Любое изменение в выходной папке приводит к необходимости изменять действие после сборки в каждом из 50 проектов DLL.

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

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

Ответ 1

Я бы поставил все DLL файлы в одну папку (определенную для Debug/Release и т.д.) и скопировал их обратно в соответствующую папку вывода вашего EXE.

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

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

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

ИЗМЕНИТЬ

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