Używać jednego rozwiązania Visual Studio do budowania zarówno x86, jak i x64 w tym samym czasie?
Mam rozwiązanie x86 Visual Studio z wieloma plikami projektu. Niektóre biblioteki DLL są zaprojektowane do pracy jako wtyczki do innych aplikacji w systemie użytkownika. Rozszerzamy niektóre biblioteki dll, aby móc obsługiwać Aplikacje 64-bitowe. To, co chciałbym zrobić, to skonfigurować rozwiązanie / projekty tak, aby samo naciśnięcie "Build" zbudowało zarówno wersje x86, jak i x64 tych bibliotek DLL. Rozwiązanie zawiera zarówno projekty C++, jak i C#. Zdaję sobie sprawę, że "Batch Build" jest w stanie zbudować zarówno, chociaż byłoby wygodniej, gdyby programiści mogli po prostu kliknąć ten sam przycisk, co wcześniej i wygenerować wszystkie wyjściowe biblioteki DLL.
Oto kilka modyfikacji, które próbowałem przetestować projekt, ale nie udało się:
Próbowałem zmodyfikować <Target Name="AfterBuild">
aby spróbować:
<Target Name="AfterBuild" Condition=" '$(Platform)' == 'x86' ">
<PropertyGroup>
<Platform>x64</Platform>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<CallTarget Targets="Build"/>
</Target>
Ale to powoduje następujący błąd:
C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(565,5): error MSB4006: There is a circular dependency in the target dependency graph involving target "Build".
Myślę, że moje warunki zapobiegną nieskończonej rekurencji, ale rozumiem, że MSBuild nie widział tego, że sposób.
Ja też próbowałem:
<Project DefaultTargets="MyBuild86;MyBuild64" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
...
<Target Name="MyBuild86">
<PropertyGroup>
<Platform>x86</Platform>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<CallTarget Targets="Build"/>
</Target>
<Target Name="MyBuild64">
<PropertyGroup>
<Platform>x64</Platform>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<CallTarget Targets="Build"/>
</Target>
Ale moje DefaultTargets
wydaje się być ignorowane z poziomu Visual Studio IDE.
Ostatnio próbowałem stworzyć osobny projekt, który importuje pierwszy projekt:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform>x64</Platform>
<PlatformTarget>x64</PlatformTarget>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<OutputPath>..\$(Configuration)\x64\</OutputPath>
<ProjectGuid>{A885CAC3-2BBE-4808-B470-5B8D482CFF0A}</ProjectGuid>
</PropertyGroup>
<Import Project="BuildTest.csproj" />
</Project>
I do tej pory okazało się to najbardziej obiecujące. Jednak Visual Studio wydaje się ignorować Moje Ustawienia OutputPath
z tego nowego projektu i zamiast tego wysyła exe / dll do ścieżki określonej w oryginalnym projekcie. Nie widzę bloku PropertyGroup
, który jest wykonywany w oryginalny projekt, żeby to obejść, więc nie jestem pewien, co się dzieje.
8 answers
Robimy coś podobnego do budowania core assemblies dla. NET CF. Spróbuj tego:
<Target Name="AfterBuild">
<MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)" Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" />
</Target>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-16 23:02:52
Importowanie projektu działa u mnie w Visual Studio 2010:
TestProject64.vcxproj
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="TestProject.vcxproj" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B7D61F1C-B413-4768-8BDB-31FD464AD053}</ProjectGuid>
</PropertyGroup>
</Project>
TestProject64.vcxproj.filtry
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="TestProject.vcxproj.filters" />
</Project>
TestProject.vcxproj ma dwie konfiguracje zdefiniowane wewnątrz: Release / x86 i Release / x64. Jak widać TestProject64.vcxproj ma tylko konfigurację Release / x64. Definiowanie co najmniej jednej konfiguracji w TestProject64.vcxproj jest konieczne, w przeciwnym razie Visual Studio nie będzie w stanie dodać TestProject64.vcxproj do a rozwiązanie.
Teraz możliwe jest włączenie obu TestProject.vcxproj i TestProject64.vcxproj do tego samego rozwiązania i zbudować Release / x86 i Release / x64 w tym samym czasie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 22:51:04
Myślę, że najlepszym sposobem na to jest wywołanie msbuild z linii poleceń. Nie trzeba edytować plików msbuild, wystarczy uruchomić
msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"
Zakładam, że jeśli programista korzysta z Visual Studio, to będzie generował biblioteki DLL tylko po to, aby mogły się z nimi debugować, i że masz osobny proces budowania, jeśli faktycznie wdrażasz biblioteki DLL?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 21:02:58
Dla C++, a jeśli jest to projekt,którego pliki / ustawienia nie zmieniają się często, jednym ze sposobów jest utworzenie dwóch projektów w ramach rozwiązania, przy czym oba projekty odnoszą się do tych samych plików źródłowych. Następnie w kompilacjach x64 ustaw jeden projekt na 64-bitowy, a drugi 32-bitowy. (W kompilacjach x86 ustaw jeden jako 32-bitowy i wyłącz drugi.)
Używamy tego od jakiegoś czasu i działa dobrze.
Oczywiście, trzeba uważać, aby wszelkie zmiany, które wprowadzasz do jednego z nich, były również wprowadzane do jego kopii. tzn. jeśli dodajesz/usuwasz plik lub zmieniasz jego ustawienie budowania, musisz to zrobić w dwóch miejscach. Zmiany w kodzie źródłowym muszą być wykonane tylko raz, ponieważ wciąż jest tylko jedna kopia KAŻDEGO pliku źródłowego.
I oczywiście możesz zdecydować, że robienie tego jest bardziej skomplikowane/ryzykowne niż rezygnacja z używania IDE. W naszym przypadku to działa naprawdę dobrze, choć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-27 11:31:36
Nie będziesz w stanie tego zrobić za pomocą interfejsu użytkownika Visual Studio. W tym celu musisz zhakować pliki MSBuild.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 18:31:41
Być może przeoczyłem sens tej dyskusji. Korzystając z programu Visual Studio, przejdź do Menedżera kompilacji/konfiguracji. Z listy rozwijanej Active Solution Platform wybierz " nowy...", pojawi się okno dialogowe Nowa platforma rozwiązania. Wybierz x64 i zaakceptuj domyślną kopię z. Zamknij okno dialogowe i Menedżer konfiguracji. Teraz otwórz Build / Batch Build. Sprawdź konfiguracje, które chcesz zbudować i je zbuduj. Znajdziesz Pliki Wykonywalne x64 build oddzielnie od plików wykonywalnych Win32. Możesz zweryfikować że są to, co było zamierzone, klikając prawym przyciskiem myszy na execs i wybierając Właściwości, wybierz kartę kompatybilność. W rozwijanym oknie możesz sprawdzić, w jakich systemach operacyjnych można uruchomić exec. Oczywiście, mogą być inne poprawki, które możesz zrobić, aby uzyskać wszystkie pliki wyjściowe w ich odpowiednich miejscach, ale ta metoda wydaje się nieco prostsza niż oszukiwanie z build niż te opisane powyżej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 21:01:48
Sugerowałbym stworzenie atrapy projektu C++ Makefile, a następnie wywołanie MSBuild dwa razy z niego:
msbuild myproj.sln /p:Configuration="Debug|Win32"
msbuild myproj.sln /p:Configuration="Debug|x64"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-14 07:51:46
Napotkałem ten problem z projektem działającym w VS2008 XP (32-bit), a także VS2010 7 (64-bit). Rozwiązaniem, którego użyłem było użycie zmiennej $(PROGRAMFILES). Rozwiązał się poprawnie na obu maszynach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-16 16:13:08