C++ 如何确保在for C++;在Visual Studio 2015中?

C++ 如何确保在for C++;在Visual Studio 2015中?,c++,visual-studio,visual-studio-2015,eigen,eigen3,C++,Visual Studio,Visual Studio 2015,Eigen,Eigen3,我在Visual Studio 2015中有一些C++代码,编译和运行在我的机器上,但不是在我的队友的上。 我们有完全相同的代码库和所有相同库的完全相同的版本,但在他的机器上,Visual Studio无法正确解析模板的某些宏,而我的工作正常 我正在尝试重新创建他的构建环境,以便重现问题。 我们都使用VisualStudio 15更新3版本140.25431.01,但是Visual C++ 2015版本不同,但是我找不到一种方法来指定我想要VisualStudio使用的版本。 我该怎么做?一般来

我在Visual Studio 2015中有一些C++代码,编译和运行在我的机器上,但不是在我的队友的

上。 我们有完全相同的代码库和所有相同库的完全相同的版本,但在他的机器上,Visual Studio无法正确解析模板的某些宏,而我的工作正常

我正在尝试重新创建他的构建环境,以便重现问题。 我们都使用VisualStudio 15更新3版本140.25431.01,但是Visual C++ 2015版本不同,但是我找不到一种方法来指定我想要VisualStudio使用的版本。 我该怎么做?一般来说,我如何确保我们的构建环境在VisualStudio中是一致的


编辑:从到目前为止我们所做的评论中获取更多信息:

  • 我们都使用完全相同的visual studio 2015版本(更新3版本14.0.25431.01)
  • 确保我们的库与解决方案目录相关,并随项目repo一起下载,因此没有错误路径
  • 将项目文件和解决方案包括在回购协议中,并确保它们具有相同的内容
    • 目标平台版本(Windows SDK版本):Windows 8.1
    • 平台工具集:Visual Studio 2015(v140)

编辑:正如@Marek R所提到的,我应该包括我的确切错误: 我想用Eigen库做一些信号处理

它崩溃的确切行尝试初始化数组,如下所示:

Eigen::ArrayX foo(数组的大小)
然后按如下方式使用该数组:

foo(索引)=条形图

Eigen使用宏覆盖模板,使用语句将此类型重新定义为:
Eigen::Array

这在我的机器上可以正常工作,但是当试图在他的机器上编译时,它失败了

3>HighRes.cpp(187): error C2514: 'Eigen::Array<int,-1,1,,-1,1>': class has no constructors
3>  c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(188): error C2039: 'size': is not a member of 'Eigen::Array<int,-1,1,,-1,1>'

3>  c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(188): error C2039: '__this': is not a member of 'Eigen::Array<int,-1,1,,-1,1>'

3>  c:\WORKING_DIR\sigproc_vs2015\eigen\eigen\src/Core/Array.h(46): note: see declaration of 'Eigen::Array<int,-1,1,,-1,1>' 3>HighRes.cpp(189): error C2064: term does not evaluate to a function taking 1 arguments
3>HighRes.cpp(187):错误C2514:“特征::数组”:类没有构造函数
3> c:\WORKING\u DIR\sigproc\u vs2015\eigen\eigen\src/Core/Array.h(46):注意:请参阅“eigen::Array”3>HighRes.cpp(188)的声明:错误C2039:“size”:不是“eigen::Array”的成员
3> c:\WORKING\u DIR\sigproc\u vs2015\eigen\eigen\src/Core/Array.h(46):注意:请参阅“eigen::Array”3>HighRes.cpp(188)的声明:错误C2039:“\uu this”:不是“eigen::Array”的成员
3> c:\WORKING\u DIR\sigproc\u vs2015\eigen\eigen\src/Core/Array.h(46):注意:请参阅“eigen::Array”3>HighRes.cpp(189)的声明:错误C2064:项不计算为带1个参数的函数
更奇怪的是,代码的其他部分对这个宏有类似的调用,但是使用了其他类型,例如:
Eigen::ArrayX baz(一些其他大小)并且他的体格不会抱怨这些。我试图在我的身上重现这种行为


更新:我有机会多玩一下他的机器,我注意到了一些事情:

1:他的机器可以很好地实例化
Eigen::ArrayX
任何其他地方,除了先前未能构建的特定代码部分

2:这个特定部分唯一的特殊之处是它在一个闭包内

auto process_in_parallel = [state](int dimension){ 
    // Other code...
    Eigen::ArrayX<int> foo(size_of_the_array);

auto process_in_parallel=[state](int-dimension){
//其他代码。。。
本征::ArrayX foo(数组的大小);
3:Eigen使用嵌套宏,使用定义ArrayX类的语句定义模板

实际上,我在让VisualStudio15使用语句和嵌套模板类处理模板时遇到了很多麻烦;编译器经常会崩溃,只要求我围绕给定行简化代码。
我很乐意通过将定义更改为非模板类型别名
Eigen::ArrayXi
,来解决这个问题。这可以很好地编译,并且构建通过了所有测试。

您需要跨PC以及代码库同步项目和解决方案

如果执行此操作,则可以在该项目的属性中明确选择用于任何项目的生成工具:

配置属性->常规->平台工具集

确保在不同的PC上选择相同的一个(这必须是两台PC都已安装的工具集)

编辑:您可能还应该确保所选的“Windows SDK版本”对于两台电脑上的所有项目都是相同的。如果选择了“最新版本”,这可能会而不是评估为相同的内容。(并且您可能还需要在同事的电脑上安装为您“工作”的SDK。)

Visual C++ 2015版本不同

修复这一点最简单的方法是将VisualStudio更新为两个版本的最新版本。它还将更新所有安装的组件,包括C++工具集。


另一个可能不同的地方是安装了Windows SDK的组件和一组系统库。请确保您使用的是相同版本的Windows(使用
winver
命令)。错误消息将有助于诊断问题。

问题中的错误消息在哪里?
无法正确解析模板的某些宏。
不是错误描述。要确保正确配置路径,首先要做的是在计算机上完全不同的目录中尝试(如果您只有一台计算机)。如果您可以在第二台计算机上访问,或者可以进行自动生成,那就更好了。@是的,包含路径和链接路径都是相对于解决方案目录的,并且所有库都被克隆为解决方案目录中的子模块。我们使用项目repo中的.props文件指向这些。我们尝试在新的loca中重新克隆不管怎样,这个问题仍然存在。你可以编译一个文件,并对列出的所有文件进行散列,或者直接保存预处理器的输出,这显然是依赖关系管理的问题