2015-10-17 42 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

你是什么意思的神器?您可以使用事前/事后构建事件来运行您想从之前构建/生成的其他项目中获取事物的任何命令。你的问题解决了吗? –