MinGW-w64 编译失败,出现 nullptr_t

Posted

技术标签:

【中文标题】MinGW-w64 编译失败,出现 nullptr_t【英文标题】:MinGW-w64 compilation fails with nullptr_t 【发布时间】:2019-12-04 18:47:19 【问题描述】:

我正在尝试使用 MinGHW-w64 编译 cpputest,但它失败了,因为它找不到 nullptr_t。失败的函数是 cputest\src\CppUTest\SimpleString.cpp:StringFrom

SimpleString StringFrom(const nullptr_t value)

    (void) value;
    return "(null)";

我尝试手动编译这个文件

C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\g++.exe -DCPPUTEST_HAVE_STRDUP=1 -DHAVE_CONFIG_H -D_TIMESPEC_DEFINED=1 @CMakeFiles/CppUTest.dir/includes_CXX.rsp -include "C:/git/tdd/cpputest/include/CppUTest/MemoryLeakDetectorNewMacros.h" -include "C:/git/tdd/cpputest/include/CppUTest/MemoryLeakDetectorMallocMacros.h" -std=c++11 -Wall -Wextra -pedantic -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -Wsign-conversion -Wno-padded -Wno-long-long -Woverloaded-virtual -Wno-old-style-cast -Wno-c++14-compat -O2 -g -DNDEBUG -o CMakeFiles\CppUTest.dir\SimpleString.cpp.obj -c C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp

失败了

C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:31: error: 'nullptr_t' does not name a type
 SimpleString StringFrom(const nullptr_t value)
                               ^~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:31: note: 'nullptr_t' is defined in header '<cstddef>'; did you forget to '#include <cstddef>'?
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:32:1:
+#include <cstddef>

C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:31:
 SimpleString StringFrom(const nullptr_t value)
                               ^~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:565:14: error: redefinition of 'SimpleString StringFrom(int)'
 SimpleString StringFrom(const nullptr_t value)
              ^~~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:479:14: note: 'SimpleString StringFrom(int)' previously defined here
 SimpleString StringFrom(int value)
              ^~~~~~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString StringFrom(cpputest_longlong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:576:29: warning: unknown conversion type character 'l' in format [-Wformat=]
     return StringFromFormat("%lld", value);
                             ^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:576:29: warning: too many arguments for format [-Wformat-extra-args]
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString StringFrom(cpputest_ulonglong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:581:29: warning: unknown conversion type character 'l' in format [-Wformat=]
     return StringFromFormat("%llu", value);
                             ^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:581:29: warning: too many arguments for format [-Wformat-extra-args]
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString HexStringFrom(cpputest_longlong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:586:29: warning: unknown conversion type character 'l' in format [-Wformat=]
     return StringFromFormat("%llx", value);
                             ^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:586:29: warning: too many arguments for format [-Wformat-extra-args]
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp: In function 'SimpleString HexStringFrom(cpputest_ulonglong)':
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:591:29: warning: unknown conversion type character 'l' in format [-Wformat=]
     return StringFromFormat("%llx", value);
                             ^~~~~~
C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:591:29: warning: too many arguments for format [-Wformat-extra-args]

我尝试了包含 cstddef 的幼稚解决方案:

#include <cstddef>

SimpleString StringFrom(const nullptr_t value)

    (void) value;
    return "(null)";

但是失败并出现同样的错误:

C:\git\tdd\cpputest\src\CppUTest\SimpleString.cpp:568:31: error: 'nullptr_t' does not name a type
 SimpleString StringFrom(const nullptr_t value)

这个错误没有任何意义,因为我包含了 cstddef。

这个问题与this question有关。

感谢任何帮助!

【问题讨论】:

您确定该文件包含&lt;cstddef&gt;?如果您将minimal reproducible example 设为#include &lt;cstddef&gt; void foo(nullptr_t) int main() foo(nullptr); ,是否会编译? 编辑了问题。是的,我很积极。除非我产生幻觉并且 #include &lt;cstddef&gt; 没有做我认为的那样。 最小示例是否可以编译,或者您是否也会收到错误? 啊,是的。 nullptr_t 不能保证在 std:: 之外。您可以在文件顶部添加using std::nullptr_t 来解决此问题。 或者你可以像使用其他所有标准类型一样使用std::nullptr_t... 【参考方案1】:

修复很简单:

SimpleString StringFrom(const std::nullptr_t value)

    (void) value;
    return "(null)";

感谢 NathanOliver-Reinstate Monica 帮助解决这个问题。

【讨论】:

以上是关于MinGW-w64 编译失败,出现 nullptr_t的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mingw-w64 交叉编译 CGAL

使用 mingw-w64 编译 mex 的链接器错误

使用 Mingw-w64 编译谷歌测试

VS Code 安装与配置(使用MSYS2环境与mingw-w64 编译环境)

MinGW-w64 C/C++编译器个版本说明

使用 cmake 和 mingw-w64 错误编译测试程序