我目前正在尝试运行这个图像分割程序,但是当我尝试编译它时遇到错误。要编译,您只需
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
它成功打印出了从文本文件中读取的两个整数。
您需要包含来自您的
limits.h
的同一个 libc 中的 bits/wchar2.h
。如果您检查您所得到的
#error
上方的后一个文件中的注释,您就会明白原因 - 它可以防止混合不兼容的头文件。
这类长期存在的问题是我构建自己的 Linux 发行版的动力。 谷歌搜索一无所获。但是......构建你自己的(交叉)编译器 解决问题。编译器在其相关头文件中有自己的定义 MB_LEN_MAX 1 glibc 中包含 MB_LEN_MAX 16。没问题。
就我而言,
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"
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
解决了问题。