【发布时间】:2018-10-06 14:08:46
【问题描述】:
我正在使用 CMake 编译一个 CUDA 项目,其中包含一个静态库和一个主文件。 MWEhere。目录是:
├── CMakeLists.txt
├── src
├── mylib.h
├── mylib.cu
├── test
├── CMakeLists.txt
├── main.cpp
在 Ubuntu 上一切正常。但在 Windows 上,我收到了链接错误:
mylib.lib(mylib.cu.obj) : error LNK2019: unresolved external symbol __cudaRegisterLinkedBinary_40_tmpxft_00006024_00000000_7_mylib_cpp1_ii_935b38c5 referenced in function "void __cdecl __sti____cudaRegisterAll(void)" (?__sti____cudaRegisterAll@@YAXXZ)\build\test\Release\main.exe : fatal error LNK1120: 1 unresolved externals
这个问题只涉及到第一个CMakeLists.txt:
cmake_minimum_required(VERSION 3.8)
project(MyTest LANGUAGES CXX CUDA)
# check requirements
find_package(CUDA 8.0 REQUIRED)
# set include and link directories
if (UNIX)
set(CUDA_SAMPLE_INC ${CUDA_TOOLKIT_ROOT_DIR}/samples/common/inc)
set(CUDA_TARGET_INC ${CUDA_TOOLKIT_ROOT_DIR}/targets/x86_64-linux/include)
set(CUDA_SAMPLE_LKN ${CUDA_TOOLKIT_ROOT_DIR}/targets/x86_64-linux/lib)
endif (UNIX)
if (WIN32)
set(CUDA_SAMPLE_INC C:/ProgramData/NVIDIA\ Corporation/CUDA\ Samples/v9.0/common/inc)
set(CUDA_TARGET_INC C:/Program\ Files/NVIDIA GPU\ Computing\ Toolkit/CUDA/v9.0/include)
set(CUDA_SAMPLE_LKN C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v9.0/lib/x64)
endif (WIN32)
include_directories(src ${CUDA_SAMPLE_INC} ${CUDA_TARGET_INC})
link_directories(${CUDA_SAMPLE_LKN})
# define and compile our static library
set(STATIC_MY_LIB mylib)
add_library(${STATIC_MY_LIB} STATIC src/mylib.cu)
# install
install(TARGETS ${STATIC_MY_LIB}
ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib
LIBRARY DESTINATION ${CMAKE_SOURCE_DIR}/lib)
# comment it out to suppress the error
set_target_properties( ${STATIC_MY_LIB} PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
# add our test project
add_subdirectory(test)
如果我注释掉set_target_properties( ${STATIC_MY_LIB} PROPERTIES CUDA_SEPARABLE_COMPILATION ON),链接错误就消失了。
环境:
- Ubuntu 16.04、gcc 5.4、Tesla Titan X、CUDA 9.1、CMake 3.10.1
- Windows 10、VS 2015、K20c、CUDA 9.0、CMake 3.10.1
为什么会这样?又如何克服?
【问题讨论】:
-
您找到解决方案了吗?我也在为此苦苦挣扎。
-
@JAustin 不幸的是没有。我最终禁用了 cuda 单独编译选项。
-
我实际上认为我想出了如何去做(供将来参考)。在 CMake 中,尝试设置 CUDA_RESOLVE_DEVICE_SYMBOLS,即 set_target_properties(Loch PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)。如果这对您来说仍然是个问题,请告诉我是否可行。
-
@JAustin 谢谢它的工作!您介意将您的评论复制到答案中,以便我可以接受您的答案。再次感谢!