【问题标题】:Clang doesn't know PTRDIFF_MAX?Clang 不知道 PTRDIFF_MAX?
【发布时间】:2020-07-13 14:54:55
【问题描述】:

我正在升级我们的构建机器(从 Windows Server 2008 到 Windows 10)并且构建在旧机器上运行良好(使用 Visual Studio)。我在新机器上使用 VS Build Tools 运行它时遇到了一些问题(我试图避免需要 VS 许可证),所以我将它移植到使用 Clang。

构建使用 Flatbuffers,我已从 1.4.0 升级到 1.12.0。在构建过程中出现以下错误:

[2/70] Building CXX object CMakeFiles\polyphemus.dir\hardwareconfig.cpp.obj

FAILED: CMakeFiles/polyphemus.dir/hardwareconfig.cpp.obj 

C:\PROGRA~2\MICROS~1\2019\BUILDT~1\VC\Tools\Llvm\x64\bin\clang-cl.exe  /nologo -TP  -I"C:\Program Files (x86)\nanomsg\include\nanomsg" -I. -I"C:\Program Files (x86)\FlatBuffers\include" -IE:\JenkinsMIDEBLD\workspace\btaylor-new_build_node_CYC-268_2\polyphemus\include /DWIN32 /D_WINDOWS /GR /EHsc /Zi /Ob0 /Od /RTC1 -MDd /showIncludes /FoCMakeFiles\polyphemus.dir\hardwareconfig.cpp.obj /FdCMakeFiles\polyphemus.dir\polyphemus.pdb -c E:\JenkinsMIDEBLD\workspace\btaylor-new_build_node_CYC-268_2\polyphemus\hardwareconfig.cpp

In file included from E:\JenkinsMIDEBLD\workspace\btaylor-new_build_node_CYC-268_2\polyphemus\hardwareconfig.cpp:3:
In file included from .\hardwareconfig_generated.h:7:
In file included from C:\Program Files (x86)\FlatBuffers\include\flatbuffers/flatbuffers.h:20:
In file included from C:\Program Files (x86)\FlatBuffers\include\flatbuffers/base.h:45:
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\algorithm(37,63): error: use of undeclared identifier 'PTRDIFF_MAX'
    return static_cast<ptrdiff_t>(_Min_value(static_cast<_CT>(PTRDIFF_MAX), static_cast<_CT>(_Value)));

没有定义 PTRDIFF_MAX 真的很奇怪,这表明 Flatbuffers 应该在其文件中完成 #include &lt;cstdint&gt;,但没有。这似乎会导致测试失败,所以我不敢相信这是一个未诊断的错误。果然,如果我将#include &lt;cstdint&gt; 添加到我的文件中,它们就会开始构建。不过,这似乎确实不是正确的解决方案-我无法相信 Flatbuffers 具有未记录的依赖项,您必须自己进行导入,这表明我做错了。请问有谁知道吗?

编辑:在 cmake 中显式打开 C++17(以及从那里在 clang 中)会在不涉及平面缓冲区的不同位置导致相同的错误:

In file included from E:\JenkinsMIDEBLD\workspace\btaylor-new_build_node_CYC-268_2\polyphemus\complexseries.cpp:2:
In file included from E:\JenkinsMIDEBLD\workspace\btaylor-new_build_node_CYC-268_2\polyphemus\include\polyphemus/complexseries.h:4:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\complex:12:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\sstream:11:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\istream:11:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\ostream:11:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\ios:11:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\xlocnum:16:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\streambuf:11:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\xiosbase:12:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\system_error:14:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\stdexcept:12:
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include\xstring(1258,47): error: use of undeclared identifier 'PTRDIFF_MAX'
        return _Min_value(static_cast<size_t>(PTRDIFF_MAX), static_cast<size_t>(-1) / sizeof(_Elem));

那是在我自己完成#include of 的文件中,所以我想这是一个红鲱鱼(也不是修复:-/)。

【问题讨论】:

  • 请注意,实际错误来自标头 &lt;algorithm&gt;,这表明您的构建设置存在更根本性的错误,而不是 FlatBuffers 标头。
  • 会不会是C++11没有启用?
  • 我注意到了这一点,但错误似乎比 Flatbuffers 错误的可能性更小......
  • 在 C++11 上... maaaybe?我认为我们之前的构建没有使用 C++11,因为我们使用的旧版本的 Visual Studio 编译器不支持它。不过,我看不到任何地方明确将其关闭。
  • 这很奇怪。在 cmake 中显式打开 C++17(以及从那里在 clang 中)会在不同的地方导致相同的错误。这次在我自己包含 cstdint 的文件之一中。没有平面缓冲区,这次全部在 Visual Studio 中。

标签: c++ clang


【解决方案1】:

原来我的包含路径中有一个 stdint.h 版本,它指定它“仅用于 Microsoft Visual C++ 编译器!”。毫不奇怪,事实证明它不适用于 Clang。你会期望它要么灾难性地失败,要么无论如何都可以工作(它确实定义了 PTRDIFF_MAX),但我想这只会导致 Clang 非常非常困惑。

无论如何,如果我从包含路径中删除它,一切都会开始工作。

【讨论】:

  • 只是为了扩展这一点,我拥有的版本来自 code.google.com/archive/p/msinttypes - 我之前使用的旧 VS 编译器不支持 C99,所以我需要那个头文件让 SWIG 与 Python 3 一起工作.显然现在我已经升级了编译器,不需要额外的头文件了!
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 2020-11-14
  • 2019-06-21
  • 2022-01-07
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多