Visual c++ 替换Visual C++;前端到先前版本之一

Visual c++ 替换Visual C++;前端到先前版本之一,visual-c++,visual-studio-2013,point-cloud-library,Visual C++,Visual Studio 2013,Point Cloud Library,我正试图从VisualStudio2013中的源代码进行编译(当然是使用v120工具集和MSCL18),因为我需要这个库用于VS2013项目。不过,这是一项棘手的任务 一方面,由于中断,PCL源代码没有在VS2013中编译 VS2013 中新C++标准模板的变化 另一方面,在VS2012中编译时,PCL DLL有自己的 CRT甚至最简单的PCL相关代码崩溃 例如,在VS2013中,此代码段: pcl::console::print_highlight(stdout, "Begin"); 由

我正试图从VisualStudio2013中的源代码进行编译(当然是使用v120工具集和MSCL18),因为我需要这个库用于VS2013项目。不过,这是一项棘手的任务

  • 一方面,由于中断,PCL源代码没有在VS2013中编译 VS2013
  • 中新C++标准模板的变化
  • 另一方面,在VS2012中编译时,PCL DLL有自己的 CRT甚至最简单的PCL相关代码崩溃
例如,在VS2013中,此代码段:

pcl::console::print_highlight(stdout, "Begin");
由于PCL DLL和my EXE中的CRT不同,在“EnterCriticalSection(&(((_FILEX*)pf)->lock));”处引发异常,如中所述

作为最后的手段,我尝试将C++前端从MSC18改为MSC17,以便接收对象或汇编文件,并将它们链接到与C18链接器一起的进一步构建步骤。我还没有找到一个好办法


因此,我的问题是,是否有人可以分享他们在这种两步编译中的经验,如何替换以前的编译器版本frontend,或者这个问题的另一种解决方案是什么?

我尝试了几种方法来编译这个第三方库,而不更改库源代码。一个原来是OK的工作是用VS2013 C++前端(TooStV120,MSCL18)代替以前的一个(VS2012,TooStV110,MSC17),用于一些文件,这些文件不经过VS2013,然后在VS2013中使用所得的Obf文件进行进一步编译。p> James McNellis的评论做得很好,因为他们帮助我更好地理解并仔细修复了VS2013 STL流和字符串对象中的编译错误,并给出了我的VS2013 STL子集,该子集使用VS2012本机工具集编译得很好

实际上,我为不同的配置和平台创建了一个自定义构建工具(C++项目->属性):

Debug|Win32
$(ComSpec) /c ""$(ProgramFiles)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat" x86   && cl.exe /c %(FullPath) /IC:\Src\PCLCompilation\local_stl /IC:/Src/PCLCompilation/boost_1_55_0 /IC:/Src/PCLCompilation/eigen/include /I"C:/Src/PCLCompilation/flann-1.8.4.v120/include" /I"$(SolutionDir)include" /I"C:/Src/PCLCompilation/pcl-master/common/include" /I"C:/Src/PCLCompilation/pcl-master/octree/include" /I"C:/Src/PCLCompilation/pcl-master/io/include" /I"C:/Src/PCLCompilation/pcl-master/filters/include" /nologo /W3 /WX- /MP4 /Od /Ob0 /Oy- /Zi /D_MSC_VER=1800 /D WIN32 /D _WINDOWS /D _WINDLL /D _MBCS /D _DEBUG /D BOOST_DISABLE_ASSERTS /D EIGEN_NO_DEBUG /D BOOST_ALL_NO_LIB /D _SCL_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_WARNINGS /D NOMINMAX /D BOOST_LIB_DIAGNOSTIC /D EIGEN_USE_NEW_STDVECTOR /D EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET /D FLANN_STATIC /D CMAKE_INTDIR=$(Configuration) /D PCLAPI_EXPORTS /Gm- /EHsc /RTC1 /MDd /GS /arch:SSE2 /fp:precise /Zc:wchar_t /Zc:forScope /GR /openmp /Fo"$(IntDir)\" /Fd"$(TargetDir)$(TargetName).pdb" /Gd /TP /wd4800 /wd4521 /wd4251 /wd4275 /wd4305 /wd4355 /wd4800 /wd4521 /wd4251 /wd4275 /wd4305 /wd4355 /analyze- /errorReport:prompt /bigobj"
Debug|x64
$(ComSpec) /c ""$(ProgramFiles)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" amd64           && cl.exe /c %(FullPath) /IC:\Src\PCLCompilation\local_stl /IC:/Src/PCLCompilation/boost_1_55_0 /IC:/Src/PCLCompilation/eigen/include /I"C:/Src/PCLCompilation/flann-1.8.4.v120/include" /I"$(SolutionDir)include" /I"C:/Src/PCLCompilation/pcl-master/common/include" /I"C:/Src/PCLCompilation/pcl-master/octree/include" /I"C:/Src/PCLCompilation/pcl-master/io/include" /I"C:/Src/PCLCompilation/pcl-master/filters/include" /nologo /W3 /WX- /MP4 /Od /Ob0      /Zi /D_MSC_VER=1800 /D WIN32 /D _WINDOWS /D _WINDLL /D _MBCS /D _DEBUG /D BOOST_DISABLE_ASSERTS /D EIGEN_NO_DEBUG /D BOOST_ALL_NO_LIB /D _SCL_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_WARNINGS /D NOMINMAX /D BOOST_LIB_DIAGNOSTIC /D EIGEN_USE_NEW_STDVECTOR /D EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET /D FLANN_STATIC /D CMAKE_INTDIR=$(Configuration) /D PCLAPI_EXPORTS /Gm- /EHsc /RTC1 /MDd /GS /arch:SSE2 /fp:precise /Zc:wchar_t /Zc:forScope /GR /openmp /Fo"$(IntDir)\" /Fd"$(TargetDir)$(TargetName).pdb" /Gd /TP /wd4800 /wd4521 /wd4251 /wd4275 /wd4305 /wd4355                                                           /errorReport:prompt /bigobj"

Release|Win32
$(ComSpec) /c ""$(ProgramFiles)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat" x86   && cl.exe /c %(FullPath) /IC:\Src\PCLCompilation\local_stl /IC:/Src/PCLCompilation/boost_1_55_0 /IC:/Src/PCLCompilation/eigen/include /I"C:/Src/PCLCompilation/flann-1.8.4.v120/include" /I"$(SolutionDir)include" /I"C:/Src/PCLCompilation/pcl-master/common/include" /I"C:/Src/PCLCompilation/pcl-master/octree/include" /I"C:/Src/PCLCompilation/pcl-master/io/include" /I"C:/Src/PCLCompilation/pcl-master/filters/include" /nologo /W3 /WX- /MP4 /O2 /Ob2 /Oy- /GL /D_MSC_VER=1800 /D WIN32 /D _WINDOWS /D NDEBUG /D BOOST_DISABLE_ASSERTS /D EIGEN_NO_DEBUG /D BOOST_ALL_NO_LIB /D _SCL_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_WARNINGS /D NOMINMAX /D BOOST_LIB_DIAGNOSTIC /D EIGEN_USE_NEW_STDVECTOR /D EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET /D FLANN_STATIC /D CMAKE_INTDIR=$(Configuration) /D PCLAPI_EXPORTS /D _WINDLL /D _MBCS /Gm- /EHsc /MD /GS /arch:AVX /fp:precise /Zc:wchar_t /Zc:forScope /GR /openmp /Fo"$(IntDir)\" /Fd"$(TargetDir)$(TargetName).pdb" /Gd /TP /wd4800 /wd4521 /wd4251 /wd4275 /wd4305 /wd4355 /analyze- /errorReport:prompt  /bigobj"
Release|x64
$(ComSpec) /c ""$(ProgramFiles)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" amd64           && cl.exe /c %(FullPath) /IC:\Src\PCLCompilation\local_stl /IC:/Src/PCLCompilation/boost_1_55_0 /IC:/Src/PCLCompilation/eigen/include /I"C:/Src/PCLCompilation/flann-1.8.4.v120/include" /I"$(SolutionDir)include" /I"C:/Src/PCLCompilation/pcl-master/common/include" /I"C:/Src/PCLCompilation/pcl-master/octree/include" /I"C:/Src/PCLCompilation/pcl-master/io/include" /I"C:/Src/PCLCompilation/pcl-master/filters/include" /nologo /W3 /WX- /MP4 /O2 /Ob2      /GL /D_MSC_VER=1800 /D WIN32 /D _WINDOWS /D NDEBUG /D BOOST_DISABLE_ASSERTS /D EIGEN_NO_DEBUG /D BOOST_ALL_NO_LIB /D _SCL_SECURE_NO_WARNINGS /D _CRT_SECURE_NO_WARNINGS /D NOMINMAX /D BOOST_LIB_DIAGNOSTIC /D EIGEN_USE_NEW_STDVECTOR /D EIGEN_YES_I_KNOW_SPARSE_MODULE_IS_NOT_STABLE_YET /D FLANN_STATIC /D CMAKE_INTDIR=$(Configuration) /D PCLAPI_EXPORTS /D _WINDLL /D _MBCS /Gm- /EHsc /MD /GS /arch:AVX /fp:precise /Zc:wchar_t /Zc:forScope /GR /openmp /Fo"$(IntDir)\" /Fd"$(TargetDir)$(TargetName).pdb" /Gd /TP /wd4800 /wd4521 /wd4251 /wd4275 /wd4305 /wd4355 /errorReport:prompt /bigobj"
具有以下产出:

$(IntDir)%(Filename).obj
我将用于不可编译文件的工具更改为这个自定义构建工具(C++文件->属性->常规->项目类型->自定义构建工具),它很好地完成了整个编译过程。字符串对象二进制表示看起来完全相同,生成的二进制DLL没有问题,所有系统都通过了所有QA测试。 这个小黑客帮助我们将所有系统迁移到VS2013,但由于我们依赖的库中的一些文件而延迟


3月30日更新:在几个月的时间里,我们在几个开发和测试箱上没有发现这种方法的任何错误。

这不起作用,因为您必须使用与工具链版本匹配的标准库(所以,如果使用Visual C++ 2012编译器,也需要使用Visual C++ 2012库,同样也适用于Visual C++ 2013)。不能链接使用不同版本的库编译的对象(这样做会导致ODR违规和更坏)。。如果需要混合和匹配,则需要使用带有C(或COM)的动态库我很清楚,我已经复习过STL的区别。对于两个编译器来说,几乎都是一样的,除了一些新的方法和新的C++标准的修饰。数据应该通过OK。几乎相同的是不一样的。作为Visual C++ 2013中Visual C++库的修改者之一,我可以告诉你,尝试T。o混合和匹配是危险的,几乎肯定会以眼泪告终。99.99%的问题可能会在编译时无法诊断,并表现为晦涩难懂、有时无法可靠复制的运行时崩溃。这就是为什么默认情况下,我们禁止链接不匹配的对象。我刚刚将所有问题都设置为可编译的我将尝试我得到的。我所做的更改是:(1)将“=删除”构造函数更改为私有构造函数,(2)删除布尔转换器上的显式关键字,(3)删除基本字符串的初始值设定项列表构造函数和(4)在另外两个基本的字符串构造函数中更改模板。就是这样,它看起来非常简单,特别是在没有字符串创建的情况下。我将点燃它,看看它将如何进行。詹姆斯,你听起来很可靠。我明白你的意思。我只是想找到方法来完成我的工作。除了替换这个想法之外C++前端和STL的子集,你能推荐什么?我可能忽略了什么?你会后悔这一天。非常令人震惊的是,没有人把这个问题添加到项目的bug跟踪器。强烈建议避免像这样的黑客。我知道这是一个黑客攻击,所以我有一个计划B,每当我回到VS2012。遇到真正的问题。事实上,我们在多次运行的情况下,在相当大的负载下使用这个库,并且在过去两周内没有发生任何问题。所以我希望它会好起来