【发布时间】:2014-03-31 11:03:23
【问题描述】:
我正在尝试从 Visual Studio 2013 中的源代码编译 The Point Cloud Library (PCL)(当然使用 v120 工具集和 MSCL18),因为我需要这个库用于 VS2013 项目。但结果却是一项棘手的任务。
- 一方面,由于破坏,PCL 源代码没有在 VS2013 中编译 VS2013 中新 C++ 标准模板的变化
- 另一方面,在 VS2012 中编译时,PCL DLL 有自己的 CRT 甚至最简单的 PCL 相关代码崩溃
例如在VS2013中这段代码sn -p:
pcl::console::print_highlight(stdout, "Begin");
由于 PCL DLL 和我的 EXE 中的 CRT 不同,在“EnterCriticalSection(&(((_FILEX *) pf)->lock));”处抛出异常,这在 this question 中有描述。
作为最后的手段,我试图将 C++ 前端从 MSCL18 更改为 MSCL17,以便接收对象或汇编程序文件并在进一步的构建步骤中使用 CL18 链接器链接它们。我还没找到好办法。
所以我的问题是,如果有人可以分享他们在这种两步编译中的经验,如何替换以前的编译器版本前端,或者这个问题的另一种解决方案是什么?
【问题讨论】:
-
这不起作用,因为您必须使用与工具链版本匹配的标准库(因此,如果您使用 Visual C++ 2012 编译器,您还需要使用 Visual C++ 2012 库,并且同样适用于 Visual C++ 2013)。您不能链接使用不同版本的库编译的对象(这样做会导致 ODR 违规甚至更糟)。如果您需要混合搭配,则需要使用动态库和它们之间的 C(或 COM)接口。
-
很好的通知。我审查了 STL 的差异。除了一些新方法和新的 C++ 标准修饰之外,这两个编译器几乎相同。所以数据应该可以通过。
-
几乎一样不是一样。作为对 Visual C++ 2013 的 Visual C++ 库进行更改的人之一,我可以告诉你,尝试混搭是危险的,几乎肯定会以眼泪收场。您可能遇到的 99.99% 的问题在编译时无法诊断,并且表现为晦涩难懂、有时无法可靠重现的运行时崩溃。这就是为什么默认情况下我们禁止链接不匹配的对象。
-
我刚刚使所有内容都可以编译,我将尝试我得到的。我所做的更改是 (1) 将“= delete”构造函数更改为私有构造函数,(2) 删除 bool 转换器上的显式关键字,(3) 删除 basic_string 的 initializer_list 构造函数和 (4) 将模板更改为两个其他 basic_string 构造函数。就是这样,它看起来很简单的变化,尤其是没有字符串创建。我要把它点燃,看看会怎样。
-
詹姆斯,你听起来很扎实。我明白你在说什么。我只是想找到完成工作的方法。除了用 C++ 前端和 STL 子集替换这个想法之外,你会推荐什么?我可能忽略了什么?
标签: visual-c++ visual-studio-2013 point-cloud-library