CMake:“sqrtf”不是“std”的成员

Mos*_*myr 3 cmake c++11

编译我的程序后

$ cmake .
$ make
Run Code Online (Sandbox Code Playgroud)

我收到这种形式的 5 个错误:

$ make
Scanning dependencies of target Project
[ 50%] Building CXX object CMakeFiles/myproj.dir/main.cpp.o
In file included from /path/to/my/proj/main.cpp:2:0: 
/path/to/my/proj/library.hpp: In member function ‘virtual double MyProjClass::get_value(double, double) const’:
/path/to/my/proj/library.hpp:419:26: error: ‘sqrtf’ is not a member of ‘std’
     const float F = (std::sqrtf(1.0f + 2.0f) - 1.0f) / 2;
                      ^
Run Code Online (Sandbox Code Playgroud)

其他错误包括floorf不是std.

查看此线程,这是因为我没有使用 C++11 进行编译,而查看此线程线程,“[...] CMake 将确保使用适当的命令行标志调用 C++ 编译器。”

好吧,我的 CMake 显然没有这样做。为什么我会收到这些错误,我该如何修复它们?

编辑:这是我的 CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(Noise)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp vector.hpp noise.hpp)
add_executable(Noise ${SOURCE_FILES})

find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
target_link_libraries(Noise ${SDL2_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

Mik*_*han 6

您没有说明您使用的是什么 C++ 编译器,但假设它是 g++ 5.x 到 7,sqrtf 并且floorf不在,或std下的命名空间内。它们只是在全局命名空间中,当被包含时。-std=c++11-std=c++14-std=c++1zcmath

  • 这使得有问题的标准库不符合标准。当使用 `<c::>` 头文件时,所有 C 标准库名称都应该放在 `::std` 中。 (6认同)