【问题标题】:error: `erfc` is not a member of `std`错误:`erfc` 不是`std` 的成员
【发布时间】:2017-09-22 11:36:17
【问题描述】:

我正在尝试根据指令 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 不兼容引起的。

【问题讨论】:

  • 当您添加CXXFLAGS += -std=c++11 时,错误是否会发生变化?您使用的是什么编译器和版本?
  • 添加标志后的输出相同。通常我使用 g++ 4.8.4。但在这里我没有明确使用 g++。我的意思是我所做的只是cmake -DCMAKE_BUILD_TYPE=Release ..,然后是make opennn
  • 我假设您的代码中已经有 #include &lt;cmath&gt;,但 this issue 可能与您的代码相关。
  • 您可能有兴趣找到一个不同于 c++ 标准库中的数学库,它太小了!如果你使用 error function,也许很快,你将需要 inverse error function,而这在 中甚至在 c++17 中也没有提供!!!
  • 你参考的地址github.com/orian/opennn网上找到的版本,你修改opennn的源码了吗?

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


【解决方案1】:

删除std::,试试这个:

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

【讨论】:

    【解决方案2】:

    解决方案 A - 更新 CMake

    您至少需要 3.1 版本的 CMake,因此如果您的版本较低,则需要更新它。

    我在默认使用 2.8 版本的 Ubuntu 14.04 上遇到了这个问题(包名“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_STANDARD 11)”行下添加“set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++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”标志。

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 2020-02-02
      • 2014-08-27
      • 2021-09-07
      • 2013-08-07
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多