2015-10-17 121 views
3

我有一個包含4個項目和24個配置的C++解決方案。該項目爲cryptest,cryptlib,cryptdlldlltest。然後是x86,x64,調試,發佈,DLL導出和DLL導入的部分交叉產品。如何控制批量生成的順序→全部生成

有一種不太明顯的依賴關係,我似乎無法在UI下表示或手動修改項目文件。該依賴性是所有的DLL相關項目取決於cryptest, Release Win32

的Visual Studio可以讓我們通過選擇構建菜單生成所有配置,然後批生成...→全選→生成。當我執行建立所有,建立了第一個配置是:

------ Build started: Project: cryptlib, Configuration: DLL-Import Debug x64 ------ 
Performing Custom Build Step 
Assembling: c:\Documents and Settings\cryptopp-5.6.3\x64masm.asm 
Performing Custom Build Step 
Compiling... 
pch.cpp 
... 

以上可以看出,機械選擇cryptlib, DLL-Import Debug x64作爲其首選。我想下面的命令:

  • cryptlib, Release Win32
  • cryptest, Release Win32
  • 不要在意其餘22 ....

問題是我不能告訴Visual Studio,全部 Win32和x64 DLL項目依賴於Win32 cryptest

我該如何控制訂單批量生成→全部生成


目前,我有過構建運行所有兩次。

========== Build: 20 succeeded, 4 failed, 0 up-to-date, 0 skipped ========== 

第二次運行結尾:與第一端

========== Build: 4 succeeded, 0 failed, 20 up-to-date, 0 skipped ========== 

重新排序當溶液文件的GlobalSection(ProjectConfigurationPlatforms)用文本編輯器(並將它們放在我想要的確切順序)這是我遇到的那種溫暖和模糊的結果。測試升級後的24個配置將建立與建立所有 Visual Studio 2005中下,但建立所有的Visual Studio 2008下不執行任何操作(從字面上看,沒有什麼)。

當我嘗試手動建立一個項目(右鍵單擊項目,然後構建),我得到這樣一個結果:

1>------ Skipped Build: Project: cryptlib ------ 
1> 
2>------ Skipped Build: Project: cryptest ------ 
2> 

在沒有理由或解釋。它肯定會很好,如果Visual Studio provided a log file試圖破譯行爲。


一個相關的問題是Visual Studio中選擇< <一些項目>>no declarative way to change it默認啓動項目。這意味着一個特定的項目需要成爲解決方案文件中列出的第一個項目,並且不能更改。


我有一個很難找到一個解決方案,友好雙方的Visual Studio 2005(如何源文件分佈),以及一個後Visual Studio 2010的升級(一些人如何使用它)。

我可以找到一些關於這個問題的信息,如博客中的Project settings changes with VS2010。但是如何實現如上所述的依賴關係更改並不明確,並且該博客僅適用於VS2010或更高版本。

回答

2

爲cryptest和cryptlib創建一個x86和x64項目。

對於每一個在x86/x64項目對,使用添加鏈接鏈接到的所有文件中的其他項目,所以你只需要每個文件的只有一個副本。用紅色箭頭所示

...鏈接...

Solution

配置管理器

使用配置管理器來建立僅適用於x86爲x86項目,64只爲x64項目。

還可以使用每個平臺的下拉列表並刪除不適用於相應項目的額外平臺。

還要確保對於x86構建,您不構建x64目標,而對於x64構建,您不通過取消選中適當的構建複選框來構建x86目標。

Configuration Manager

依賴

這樣創建的依賴關係:

  • cryptlib32取決於什麼
  • cryptest32取決於cryptlib32
  • cryptlib64取決於cryptlib32和cryptest32
  • cryptest64取決於cryptlib64
  • 所有其餘項目取決於cryptlib32/64和cryptest32/64酌情

...一個例子......

Project Dependencies

結果

這應該會產生你想要的結果。

測試

在我的測試項目,這和預期一樣。我叫我的所有代碼前綴ClassLibraries,只是添加libtest上月底模仿你的配置,並final只是任何一個項目前兩個項目後...

x86的lib和測試版本首先, x64的lib和測試下,所有其他的東西...

------ Rebuild All started: Project: ClassLibraryLib32, Configuration: Debug x86 ------ 
    ClassLibraryLib32 -> C:\Users\Kory\Source\KoryG-Code\Solution1\ClassLibraryLib32\bin\x86\Debug\ClassLibraryLib.dll 
------ Rebuild All started: Project: ClassLibraryLib32, Configuration: Release x86 ------ 
    ClassLibraryLib32 -> C:\Users\Kory\Source\KoryG-Code\Solution1\ClassLibraryLib32\bin\x86\Release\ClassLibraryLib.dll 
------ Rebuild All started: Project: ClassLibraryTest32, Configuration: Release x86 ------ 
    ClassLibraryTest32 -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryTest32\bin\x86\Release\ClassLibraryTest.dll 
------ Rebuild All started: Project: ClassLibraryTest32, Configuration: Debug x86 ------ 
    ClassLibraryTest32 -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryTest32\bin\x86\Debug\ClassLibraryTest.dll 
------ Rebuild All started: Project: ClassLibraryLib64, Configuration: Debug x64 ------ 
    ClassLibraryLib64 -> C:\Users\Kory\Source\KoryG-Code\Solution1\ClassLibraryLib64\bin\x64\Debug\ClassLibraryLib.dll 
------ Rebuild All started: Project: ClassLibraryLib64, Configuration: Release x64 ------ 
    ClassLibraryLib64 -> C:\Users\Kory\Source\KoryG-Code\Solution1\ClassLibraryLib64\bin\x64\Release\ClassLibraryLib.dll 
------ Rebuild All started: Project: ClassLibraryTest64, Configuration: Release x64 ------ 
    ClassLibraryTest64 -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryTest64\bin\x64\Release\ClassLibraryTest.dll 
------ Rebuild All started: Project: ClassLibraryTest64, Configuration: Debug x64 ------ 
    ClassLibraryTest64 -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryTest64\bin\x64\Debug\ClassLibraryTest.dll 
------ Rebuild All started: Project: ClassLibraryFinal, Configuration: Release x86 ------ 
    ClassLibraryFinal -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryFinal\bin\x86\Release\ClassLibraryFinal.dll 
------ Rebuild All started: Project: ClassLibraryFinal, Configuration: Release x64 ------ 
    ClassLibraryFinal -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryFinal\bin\x64\Release\ClassLibraryFinal.dll 
------ Rebuild All started: Project: ClassLibraryFinal, Configuration: Debug x86 ------ 
    ClassLibraryFinal -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryFinal\bin\x86\Debug\ClassLibraryFinal.dll 
------ Rebuild All started: Project: ClassLibraryFinal, Configuration: Debug x64 ------ 
    ClassLibraryFinal -> c:\users\kory\Source\KoryG-Code\Solution1\ClassLibraryFinal\bin\x64\Debug\ClassLibraryFinal.dll 
========== Rebuild All: 12 succeeded, 0 failed, 0 skipped ========== 
+0

謝謝科裏。我正在通過MSDN(https://msdn.microsoft.com/en-us/library/windows/apps/jj714082%28v=vs.105%29.aspx)[通過添加爲鏈接共享代碼]是最受歡迎的)。在這種情況下,***'cryptest' ***是一個EXE,而示例共享源代碼。我想這會導致,如何共享一個EXE工件,而不是源文件。 – jww

+0

爲了完整起見,***'cryptest.exe' ***需要的原因是因爲32位版本的可執行文件安裝了完整性指紋以檢測DLL上的一些篡改。它是一個FIPS 140-2 DLL,它的一個策略要求。該要求沒有其他原因存在。 – jww

+0

你是什麼意思的神器?您可以使用事前/事後構建事件來運行您想從之前構建/生成的其他項目中獲取事物的任何命令。你的問題解決了嗎? –