错误:`erfc`不是`std`的成员

时间:2017-09-22 11:36:17

标签: c++ c++11 makefile opennn

我正在尝试根据说明here构建 OpenNN 库。但是之后

make opennn

我得到以下输出(未完整):

[2%] Built target tinyxml2 
[4%] Building CXX object opennn/CMakeFiles/opennn.dir/variables.cpp.o
In file included from /home/wolfgang/Downloads/OpenNN/opennn/variables.h:32:0,
             from /home/wolfgang/Downloads/OpenNN/opennn/variables.cpp:16:
/home/wolfgang/Downloads/OpenNN/opennn/vector.h: In member function ‘bool OpenNN::Vector<T>::Lillieforts_normality_test() const’:
/home/wolfgang/Downloads/OpenNN/opennn/vector.h:1144:20: error: ‘erfc’ is not a member of ‘std’
     Fx = 0.5 * std::erfc((mean - (*this)[i])/(standard_deviation*std::sqrt(2)));

上述输出以

结尾
make[3]: *** [opennn/CMakeFiles/opennn.dir/variables.cpp.o] Error 1
make[2]: *** [opennn/CMakeFiles/opennn.dir/all] Error 2
make[1]: *** [opennn/CMakeFiles/opennn.dir/rule] Error 2
make: *** [opennn] Error 2

我想我应该使用-std=c++11或其他东西,但我不确切知道如何。我试图添加这一行

CXXFLAGS += -std=c++11

Makefile但它不起作用。

我不知道cmakemake的任何内容。但是这些错误是由与旧版c++xx不兼容造成的。

2 个答案:

答案 0 :(得分:0)

删除std ::,试试这个:

Fx = 0.5 * erfc((mean - (*this)[i])/(standard_deviation*std::sqrt(2)));

答案 1 :(得分:0)

解决方案A - 更新CMake

你至少需要3.1版的CMake,所以如果你的版本较低,你需要更新它。

我在Ubuntu 14.04上遇到了这个问题,它默认使用2.8版(包名“cmake”);卸载它并安装“cmake3”(在Ubuntu 14.04上,“cmake3”包含CMake 3.5)。

因此,对于Ubuntu 14.04,官方文档包含错误,“sudo apt-get install cmake”应替换为“sudo apt-get install cmake3”;但请注意,这可能不适用于不同的(较新的)系统。

解决方案B - 编辑CMakeLists

这适用于较旧的CMake版本(至少2.6)。

更新OpenNN源存储库根目录中的“CMakeLists.txt”文件;在“set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")”行下添加“set (CMAKE_CXX_STANDARD 11)”行(应该是第5行)。

<强>解释

OpenNN使用“set (CMAKE_CXX_STANDARD 11)”告诉CMake应该使用C ++ 11标准。但是,this is supported since CMake 3.1。旧的CMake没有捕获到这个问题,因为OpenNN的CMakeLists的第一行是“cmake_minimum_required(VERSION 2.6)”,其中“最小版本是2.6”。这允许使用CMake版本在OpenNN上运行CMake,该版本不支持所有使用的功能(通过OpenNN),这会导致此问题。

第二个解决方案(解决方案B)只是手动为编译器添加所需的“-std=c++11”标志。