2011-02-10 14 views
10

Zdaję sobie sprawę, że to pytanie zostało zadane wcześniej - ale żadna z odpowiedzi odnoszą się do mojego konkretnego przypadku:Visual Studio: DLL zależnych kopiowania kierować folderu

  • Mam roztwór zawierający macierzystym C++ projekt EXE , który z kolei zależy od 40+ natywnych projektów DLL C++ (w tym samym rozwiązaniu).

  • Projekt EXE ma zwykle Debug, Release (i profilu) konfigurację, ale od nich sama baza kodu źródłowego jest używany do budowy trzech różnych aplikacji (słownie A1, A2 i A3). Ponadto jest przeznaczony dla x32 i x64, czyli łącznie 3 x 3 x 2 = 18 konfiguracji projektu.

  • Projekty DLL są wspólne dla wszystkich trzech aplikacji docelowych, więc nie są tylko 3 (Debug, Release, profilu) razy 2 (x32, x64) = 6 konfiguracjach.

  • Ponieważ projekt EXE zależy od bibliotek DLL, musi on skopiować odpowiednie dane wyjściowe projektów DLL do folderu docelowego (lub jego podfolderu), gdy zostaną zmodyfikowane.

Jak radzić sobie z aktualizacją bibliotek DLL?

  • akcję post-build w każdym projekcie DLL nie działa (dobrze), jak miałoby to skopiować DLL do odpowiedniego folderu wyjściowego A1, A2 i A3. Każda zmiana w folderze wyjściowym powoduje konieczność modyfikacji działania po wybudowaniu w każdym z 50 projektów DLL.

  • Obecnie dodałem same biblioteki DLL jako elementy projektu do projektu EXE i skonfigurowałem niestandardowe narzędzie do budowania, aby skopiować je do folderu wyjściowego. Ale to wymaga, żebym dodawał każdą bibliotekę DLL 6 razy, więc kończę z 6 x 50 = 300 DLL!

To, czego naprawdę potrzebuję, to coś w rodzaju opcji Kopiuj lokalnie, która niestety działa tylko złożeń. Czy proponujesz uprościć tę konfigurację kompilacji?

Odpowiedz

5

Co mogę zrobić, to umieścić wszystkie pliki DLL w jednym folderze (specyficznym dla Debug/Release itp.) I skopiować je z powrotem do odpowiedniego folderu wyjściowego pliku EXE.

Można to zrobić tylko w dwóch działań:

  • Ustaw katalog wyjściowy wszystkich bibliotek DLL w folderze jak $(ConfigurationName)_$(PlatformShortName)

    • zaznaczyć wszystkie DLL projektów
    • prawym przyciskiem myszy -> propoerties
    • wybierz wszystkie konfiguracje i wszystkie platformy
    • ustawić outp ut reż
  • Dodaj akcję post-build do projektu EXE, wspólne dla wszystkich konfiguracji, która kopiuje $(ConfigurationName)_$(PlatformShortName)\*.dll do $(TargetDir)

EDIT

istnieje problem w sekundę krok, ponieważ $(ConfigurationName) twojego EXE nie jest tym samym, co twoje projekty DLL. Nie jestem pewien, ale być może będziesz w stanie wydedukować odpowiednią konfigurację, aby nadal mieć jedno wydarzenie post-build dla wszystkich swoich 18 konfiguracji. Może to być nowe pytanie SO :)

+0

Świetnie! Dlaczego wcześniej o tym nie myślałem? –

+0

Cieszę się, że lubiłem :) zobacz moją edycję problemu, jednak ... – CharlesB

+0

Tak, zauważyłem. Ale to jest łatwe do zarządzania - oznacza to tylko trzy nieznacznie różne działania po instalacji. –

Powiązane problemy