基于CMAKE的CUDA应用程序的构建失败 - 没有传递给链接器的文件

CMake-based build of CUDA app fails - no files passed to linker

本文关键字:文件 链接 CUDA CMAKE 应用程序 构建 基于 失败      更新时间:2023-10-16

我正在尝试将CMake与我的CUDA项目一起使用,但是当在具有CUDA启用设备的系统上编译时,我很难找到它来构建可执行文件。

有问题的CMakeLists.txt在下面。它支持具有和不具有CUDA的设备的系统,并且在没有CUDA的MacBook上构建。

cmake_minimum_required (VERSION 2.8)
message(STATUS "CMake version: ${CMAKE_VERSION}")
project(stockModel)
# Grab the CUDA package
find_package(CUDA)
set(GPU_ACCELERATED ${CUDA_FOUND})
# Set directory and compilation flags for both g++ and nvcc
set(CMAKE_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS}
    -gencode arch=compute_50,code=sm_50; -std=c++11; -lcurand;"
   )
set(CUDA_PROPAGATE_HOST_FLAGS off)
# Add directories
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/core/)
if (${GPU_ACCELERATED})
  include_directories(${CMAKE_CURRENT_SOURCE_DIR}/support/)
endif()
# Setup environments, depending on GPU accel. status
set(SRCS build/main.cpp core/callModels.cpp)
set(INCS core/callModels.h)
if (${GPU_ACCELERATED})
  set(SRCS ${SRCS} support/prng.cu support/debugCFP.cu)
  set(INCS ${INCS} support/prng.h support/debugCFP.h)
  set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/core/callModels.cpp
                          PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ
                         )
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}
                          -L/usr/local/cuda/lib64 -lcuda -lcudart"
 )
endif()
# Create executable
message(STATUS "Sources: ${SRCS}")
message(STATUS "Includes: ${INCS}")
cuda_add_executable(stockModel ${SRCS} ${INCS})

我尝试在Jetson TX1上构建时遇到的错误如下:

...
[ 80%] Building CXX object CMakeFiles/stockModel.dir/main.cpp.o
[100%] Linking CXX executable stockModel
c++: fatal error: no input files
compilation terminated.
...

关于这里出了什么问题的想法?显然,这与cuda的"其他"有关,但是我对造成这种情况的原因感到不知所措。

让我知道您是否需要更多详细信息。

这是详细输出的相关部分:

...
[100%] Linking CXX executable stockModel
/usr/local/bin/cmake -E cmake_link_script CMakeFiles/stockModel.dir/link.txt --verbose=1
/usr/bin/c++   -std=c++11 -pthread  
c++: fatal error: no input files
compilation terminated.

我已将完整的make VERBOSE=1输出上传到Github上的此要旨。

cmake有时对空间和列表组合很挑剔。我知道这听起来并不是一个解释,但我不是专家。

您需要做的就是替换:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}
                          -L/usr/local/cuda/lib64 -lcuda -lcudart"

与此:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/cuda/lib64 -lcuda -lcudart")

(单行(。那应该做到。至少 - 它在我的系统上确实如此(我创建了带有文件名的虚拟源文件来尝试此功能(。