编译器错误 MB_LEN_MAX 的假设值错误

问题描述 投票:0回答:3

我目前正在尝试运行这个图像分割程序,但是当我尝试编译它时遇到错误。要编译,您只需

make
,它运行命令

g++ -g -O3 -I. -o segment segment.cpp -lm

然而,它遇到了编译错误——它的输出是

In file included from /usr/include/wchar.h:887:0,
                 from /usr/include/c++/6/cwchar:44,
                 from /usr/include/c++/6/bits/postypes.h:40,
                 from /usr/include/c++/6/iosfwd:40,
                 from /usr/include/c++/6/ios:38,
                 from /usr/include/c++/6/istream:38,
                 from /usr/include/c++/6/fstream:38,
                 from ./pnmfile.h:27,
                 from segment.cpp:23:
/usr/include/x86_64-linux-gnu/bits/wchar2.h:448:3: error: #error "Assumed value of MB_LEN_MAX wrong"
 # error "Assumed value of MB_LEN_MAX wrong"
   ^~~~~
Makefile:14: recipe for target 'segment' failed
make: *** [segment] Error 1

这里是

/usr/include/x86_64-linux-gnu/bits/wchar2.h

的相关区域
  /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
     But this would only disturb the namespace.  So we define our own
     version here.  */
#define __WCHAR_MB_LEN_MAX  16
#if defined MB_LEN_MAX && MB_LEN_MAX != __WCHAR_MB_LEN_MAX
# error "Assumed value of MB_LEN_MAX wrong"
#endif
  if (__bos (__s) != (size_t) -1 && __WCHAR_MB_LEN_MAX > __bos (__s))
    return __wcrtomb_chk (__s, __wchar, __ps, __bos (__s));
  return __wcrtomb_alias (__s, __wchar, __ps);
}

以及

segment.cpp
的相关领域:

#include <cstdio>
#include <cstdlib>
#include <image.h>
#include <misc.h>
#include <pnmfile.h> //<-- Line 23 of segment.cpp, where the error occurs
#include "segment-image.h"

pnmfile.h

#include <cstdlib>
#include <climits>
#include <cstring>
#include <fstream> //<-- Line 27 of pnmfile.h where the error occurs
#include "image.h"
#include "misc.h"

有谁知道导致此错误的原因(如果是,如何修复)?我正在运行带有 g++ 6.4.0 的 Ubuntu 16.04。感谢您提供的任何帮助!

编辑:我已经确认 fstream 确实有效。我整理了以下内容

#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;

int main() {
    ifstream is("in.txt");
    int a, b;
    is >> a >> b;
    cout << a << endl;
    cout << b << endl;
    return 0;
}

使用相同的命令

g++ -g -O3 -I. -o temp.exe temp.cpp -lm

它成功打印出了从文本文件中读取的两个整数。

c++ compiler-errors ubuntu-16.04
3个回答
0
投票

您需要包含来自您的

limits.h
的同一个 libc 中的 bits/wchar2.h
 
。如果您检查您所得到的 #error 上方的
后一个文件
中的注释,您就会明白原因 - 它可以防止混合不兼容的头文件。


0
投票

这类长期存在的问题是我构建自己的 Linux 发行版的动力。 谷歌搜索一无所获。但是......构建你自己的(交叉)编译器 解决问题。编译器在其相关头文件中有自己的定义 MB_LEN_MAX 1 glibc 中包含 MB_LEN_MAX 16。没问题。


0
投票

就我而言,

emscripten

emcc ... -I/usr/share/emscripten/cache/sysroot/include ... -I/usr/include ...
(有很多
-I/...
)。

生成

In file included from /usr/include/stdlib.h:

/usr/include/x86_64-linux-gnu/bits/stdlib.h: error: "Assumed value of MB_LEN_MAX wrong"

按照@peterph的建议,我在整个操作系统中搜索了

stdlib.h
find / -name stdlib.h 2> /dev/null
)并找到了
/usr/include/stdlib.h
limits.h
以及
#define MB_LEN_MAX 16
grep -R MB_LEN_MAX
)以及
/usr/share/emscripten/cache/sysroot/include/stdlib.h
 limits.h
#define MB_LEN_MAX 4

从原始构建命令中删除

-I/usr/include
解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.