我正试图从源代码编译libgtextutils(fastxtoolkit所需)。"/configure命令运行良好,但随后的make命令会产生一个我无法解决的错误。
text_line_reader.cpp: In member function ‘bool TextLineReader::next_line()’:
text_line_reader.cpp:47:9: error: cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ in return
return input_stream ;
^~~~~~~~~~~~
make[3]: *** [text_line_reader.lo] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
我在Mac上,OSX 10.11.6(英特尔)
任何可能解决这一问题的建议都将不胜感激。
请参阅《移植到GCC 6》指南,该指南将此作为必须处理的更改之一,因为GCC 6默认为C++14模式而不是C++03模式:
无法将"std::ostream"转换为"bool"
从C++11开始,iostream类不再隐式转换为
void*
,因此不再有效地执行以下操作:bool valid(std::ostream& os) { return os; }
必须更改这样的代码才能将iostream对象显式转换为bool,例如
return (bool)os;
或return static_cast<bool>(os);
另一种选择是在编译器标志中显式使用-std=c++03
以C++03模式进行编译,但最好修复代码。上面给出的修复将使代码与任何C++版本兼容。
这是因为使用了较新版本的gcc编译器(C++11)。
使用static_cast<bool>()
解决问题。
示例:更改
success = move_group.move();
至
success = static_cast<bool>(move_group.move());
根据Muthana和Jonathan的回答,对于那些完全不懂C++但想在*unix上安装fastx工具包并遇到这些具有挑战性的响应的人来说,答案是在打开源代码后运行此程序:
cd libgtextutils-0.7
sed -i '47s/input_stream/static_cast<bool>(input_stream)/' src/gtextutils/text_line_reader.cpp
./configure
make
make install
这使得另一位显然知识渊博的受访者建议在不必理解他们所说的一个词的情况下做出改变。这应该能让我们这些只是想安装一些旧软件,而不想学习如何编写C++的人(现在…)
另一个选项是覆盖make命令中的C++标志:
make CXXFLAGS='-std=c++03 -O1'
如上所述,fastx也会有一个编译错误,但如果你把它传递给,它就会编译
make CXXFLAGS=-O1
。