我正在尝试使用 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".
链接器错误的细节在这个 SO 问题中讨论: CUDA 动态并行生成文件
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)
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")
这包括自动链接等