簡體   English   中英

已使用VS2015項目和解決方案構建的vc ++解決方案清潔項目的msbuild

[英]msbuild of a vc++ solution cleaning project after already built using VS2015 projects and solujtions

我一直在重新設計我的自定義VC ++構建,以與新的TFS 2015構建解決方案兼容。

問題正在運行msbuild。 我可以發布一個簡化的版本,但是我的解決方案包含兩個項目:

1個旨在構建所有必需庫的Makefile項目,以及1個.exe項目。

我在.exe項目中有一個對makefile項目的引用,因此,如果需要,.exe的生成會強制該庫的生成。

我們看到的問題是,當我們使用解決方案的msbuild進行重建時,它將首先重建庫,然后在到達.exe時,它將清理庫項目,從而導致某些重建的文件被刪除並然后,由於.lib文件已刪除,因此阻止了.exe文件的鏈接。

為什么要再次清理makefile項目? 似乎到.exe項目時,它重新解析了依賴項,並且不知道該庫項目已經被重建。

提前致謝。 拉里

如果同一文件夾中有多個項目,則在編譯下一個項目時,Visual Studio會嘗試擦除輸出文件夾(通常是“調試”或“發布”)。 最好的解決方案是將每個項目放在單獨的文件夾中。

我沒有詳細介紹所有細節,但是發生這種情況的原因是,在命令行上進行構建時,重建exe項目會導致exe項目的Clean + Build,並且exe項目的Clean目標最終稱為CleanReferencedProjects目標這將導致在Makefile項目(以及以后的Build)中調用Clean。

此CleanReferencedProjects以BuildingInsideVisualStudioBuildProjectReferences屬性為條件,因此在VS內部進行構建還是會跳過此步驟,因為BuildingInsideVisualStudio是true,甚至記錄在案:

直接從命令行構建項目時,請清理磁盤上存在的那些引用項目。 對於IDE構建和命令行.SLN構建,解決方案構建管理器將負責此工作。

BuildProjectReferences屬性記錄如下:

默認情況下,我們將構建(如果適用,清理)所有項目引用。 但這可以用來禁用

因此,一種可能的解決方案是調用msbuild some.sln /t:Rebuild /p:BuildProjectReferences=False 在只有2個項目的情況下,這將正常工作,但是我不能保證這將始終在具有更多項目間依賴關系的更復雜的情況下工作。

現在有一件事讓我感到奇怪:我為什么從來沒有親眼看到這種行為? 答案在於,我不經常使用makefile項目,而我使用的C ++項目則略有不同:在那里,Rebuid目標是根據Clean + Build定義的(對於Makefile項目,它是獨立的,單獨的目標)。 這樣,當exe項目調用BuildProjectReferences時,它將在C ++項目中調用Clean,但結果是

Target "Clean" skipped. Previously built successfully.

因為當C ++項目的Rebuild被調用時,它已經被稱為Clean and Build。

因此,另一個可能的解決方案是對Makefile項目執行相同的操作。 您說您的重建還有其他要求; 我不知道它們是什么,也不知道為什么需要它們(並且說Rebuild與Clean + Build效果不一樣是不對的),但是無論如何它都可能起作用,例如在makefile項目中一直如此(一直這樣)在文件末尾):

<Target Name="Rebuild" DependsOnTargets="Clean;Build">
  <!--additional requirements here perhaps?-->
</Target>

一切正常,清理/構建僅被調用一次。

如果這些解決方案都不適用,那么除了從解決方案中刪除makefile項目,然后在解決方案之前在本地和TFS中手動構建它之外,我不會立即看到另一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM