Cuda CMake:未定义的引用

问题描述 投票:0回答:2

我正在尝试使用 cmake 编译我的项目,但这很困难。我的项目用一个简单的 make 编译,而不是用 cmake。错误是在链接期间。 CMake 更喜欢启动 g++ ... -o ... 而不是 nvcc ... -o ...

如果我强制 nvcc,错误是 -rdynamic is unknown.

所以,这是我的 cmake 文件

cmake_minimum_required(VERSION 2.8)
project(LightRays)

find_package(CUDA QUIET REQUIRED)

list(APPEND CUDA_NVCC_FLAGS "-std=c++11;-rdc=true")

file(GLOB_RECURSE
        source_file
        src/*
        include/*)


CUDA_ADD_EXECUTABLE(LightRays ${source_file})

target_link_libraries(LightRays -lSDL -L/opt/cuda/lib64 -lcuda -lcudart)

add_definitions(-std=c++11)

target_link_libraries(LightRays -lSDL -L/opt/cuda/lib64 -lcuda -lcudart)

add_definitions(-std=c++11)

这里有错误:

/tmp/tmpxft_00006509_00000000-4_global.cudafe1.stub.c:8: référence indéfinie vers « __cudaRegisterLinkedBinary_41_tmpxft_00006509_00000000_7_global_cpp1_ii_0ad406bb »
CMakeFiles/LightRays.dir/src/tools/LightRays_generated_tools.cu.o: dans la fonction « __sti____cudaRegisterAll_40_tmpxft_00006518_00000000_7_tools_cpp1_ii_278b9139() »:
....

编辑:回答后,我通过这个更改了我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.0)
project(LightRays)

find_package(CUDA REQUIRED)

list(APPEND CUDA_NVCC_FLAGS "-std=c++11 -rdc=true")
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
add_definitions(-std=c++11)

set(CUDA_SEPARABLE_COMPILATION ON)

file(GLOB_RECURSE
    source_file
    src/*
    include/*)

cuda_add_executable(LightRays ${source_file})
target_link_libraries(LightRays -lSDL)

现在,我有这些错误:

CMake Error at /usr/share/cmake-3.2/Modules/FindCUDA.cmake:1455 (_cuda_get_important_host_flags):
  _cuda_get_important_host_flags Function invoked with incorrect arguments
  for function named: _cuda_get_important_host_flags
Call Stack (most recent call first):
  /usr/share/cmake-3.2/Modules/FindCUDA.cmake:1570 (CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS)
  CMakeLists.txt:17 (cuda_add_executable)


-- Configuring incomplete, errors occurred!
See also "/home/qnope/Programmation/cuda/LightRay/build/CMakeFiles/CMakeOutput.log".
c++ cuda cmake
2个回答
1
投票

链接器错误的细节在这个 SO 问题中讨论: CUDA 动态并行生成文件

为了使用CMake解决它,您需要将

CUDA_SEPARABLE_COMPILATION
设置为
ON
。 我还建议使用最新的 CMake 版本 (3.x),因为自版本 2.8 以来 FindCUDA 有一些错误修复。

您的

CMakeLists.txt
文件将如下所示:

cmake_minimum_required(VERSION 3.0)
project(LightRays)

find_package(CUDA REQUIRED)

list(APPEND CUDA_NVCC_FLAGS "-std=c++11")
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
add_definitions(-std=c++11)

set(CUDA_SEPARABLE_COMPILATION ON)

file(GLOB_RECURSE
    source_file
    src/*
    include/*)

cuda_add_executable(LightRays ${source_file})
target_link_libraries(LightRays -lSDL)

0
投票

Modern CMake 不再使用

find_package(CUDA REQUIRED)
风格,另见 https://cliutils.gitlab.io/modern-cmake/chapters/packages/CUDA.html
CUDA
变成了CMake语言,就像
CXX
:

set(PROJECT_NAME MY_PROJECT)
project(${PROJECT_NAME} LANGUAGES CUDA CXX)

也可以测试CUDA是否可用:

check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
    enable_language(CUDA)

    # to tell your code it was found via #ifdef USE_CUDA:
    add_definitions(-DUSE_CUDA)    

    include_directories("${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}")
endif()

# after definition of executable or library dont forget cuda arch version(s)

set_target_properties(${PROJECT_NAME} PROPERTIES CUDA_ARCHITECTURES "35;50;72")

这包括自动链接等

© www.soinside.com 2019 - 2024. All rights reserved.