【问题标题】:std::isnan has not been declared, with g++-5std::isnan 尚未声明,使用 g++-5
【发布时间】:2018-05-14 10:56:08
【问题描述】:

我正在尝试使用 nvcc 和 g++-5 编译我的程序,但出现此错误。

In file included from /usr/include/glm/detail/func_common.hpp:426:0,
             from /usr/include/glm/detail/func_geometric.inl:5,
             from /usr/include/glm/detail/func_geometric.hpp:113,
             from /usr/include/glm/geometric.hpp:6,
             from /usr/include/glm/detail/func_matrix.inl:4,
             from /usr/include/glm/detail/func_matrix.hpp:149,
             from /usr/include/glm/detail/type_mat2x2.inl:4,
             from /usr/include/glm/detail/type_mat2x2.hpp:182,
             from /usr/include/glm/mat2x2.hpp:6,
             from /usr/include/glm/glm.hpp:71,
             from src/controls.cpp:6:
/usr/include/glm/detail/func_common.inl:623:14: error: ‘std::isnan’   has not been declared
   using std::isnan;
          ^
/usr/include/glm/detail/func_common.inl:659:14: error: ‘std::isinf’ has not been declared
   using std::isinf;

使用 g++ 可以正确编译,但 nvcc 需要 g++-5。有谁知道如何解决这个问题?顺便说一句,当我在 Ubuntu 上运行 sudo do-release-upgrade 时,这种情况就开始发生了。

nvcc --version 输出是这样的:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

g++-5 --version 输出是这样的:

g++-5 (Ubuntu 5.5.0-1ubuntu1) 5.4.1 20171010
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++ --version 输出是这样的:

g++ (Ubuntu 7.2.0-8ubuntu3) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我正在使用 c++11 进行编译,并且我的源文件中不包含 cmath。这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.7 FATAL_ERROR)
set(CMAKE_C_COMPILER /usr/bin/gcc-5 CACHE PATH "" FORCE)
set(CMAKE_CXX_COMPILER /usr/bin/gcc-5 CACHE PATH "" FORCE)
project(cpu_pcd C CXX CUDA)

add_compile_options(-std=c++11)

file(GLOB SRC src/*.cpp src/*.hpp)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

find_package(OpenGL REQUIRED)
find_package(glfw3 REQUIRED)
find_package(GLEW REQUIRED)
find_package(CUDA REQUIRED)

include_directories(src/)
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLFW_INCLUDE_DIRS})
include_directories(${CUDA_INCLUDE_DIRS})

cuda_add_library(kernel src/update_particles.cu)
cuda_add_executable(cpu_pcd ${SRC})

set_target_properties(cpu_pcd
  PROPERTIES CUDA_SEPARABLE_COMPILATION on)

target_link_libraries(cpu_pcd kernel)
target_link_libraries(cpu_pcd ${OPENGL_LIBRARIES} glfw  ${GLEW_LIBRARIES} ${CUDA_LIBRARIES} pthread)

【问题讨论】:

    标签: c++ gcc cuda nvcc


    【解决方案1】:

    您需要使nvccC++11 模式运行宿主C++ 编译器(直接将此选项传递给gcc 是不够的):

     nvcc -Xcompiler "-std=c++11"
    

    详情可见here

    相关信息:

    c++ version supported by cuda 5.0

    Error while using CUDA and C++11

    【讨论】:

    • 我试过了,没用。也试过这个nvcc -std=c++11 src/*.cpp -o main -lpthread -lGL -lGLEW
    • 在 cmake 中启用详细模式并检查传递给 nvcc 的参数
    • 您可能还想为 nvcc 本身启用详细模式以检查它如何调用 g++。
    • 似乎在调用 nvcc 之前编译失败。错误弹出前调用的命令是/usr/bin/g++-5 -DGLFW_DLL -I/home/dev/work/octree-cpu-pcd/src -std=c++11 -o CMakeFiles/cpu_pcd.dir/src/controls.cpp.o -c /home/dev/work/octree-cpu-pcd/src/controls.cpp
    • "有什么建议吗?"修复 g++-5
    【解决方案2】:

    std::isnan 和 std::isinf 在 <cmath> 中声明,从 C++11 开始。是否包含该标题?编译是在 C++11 或更高版本的模式下完成的吗?

    【讨论】:

      【解决方案3】:

      对于那些感兴趣的人,我解决了它,像这样更改CMakeLists.txt 的两行:

      set(CMAKE_C_COMPILER /usr/bin/gcc-5 CACHE PATH "" FORCE)
      set(CMAKE_CXX_COMPILER /usr/bin/g++ CACHE PATH "" FORCE)
      

      现在它可以正确编译,感谢所有愿意帮助的人。

      【讨论】:

      • 我使用 gcc4.9 在哪里可以准确找到这个文件?
      猜你喜欢
      • 2022-01-20
      • 2018-03-09
      • 1970-01-01
      • 2017-02-07
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多