cmake cuda在Windows上单独的编译静态LIB链接错误,但在Ubuntu上没有
CMake CUDA separate compilation static lib link error on Windows but not on Ubuntu
我正在使用cmake编译一个包含静态lib和主文件的CUDA项目。MWE在这里。目录是:
├── 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)buildtestReleasemain.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
我在1、2中尝试了建议。但是它们都没有起作用。
为什么会发生这种情况?以及如何克服?
在处理这个问题几天后,我认为我找到了一个解决方案。使用cmake创建静态库时,设置cuda_resolve_device_symbols,即使用
set_target_properties(your_project PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)
根据NVIDIA的这篇文章,此设置迫使CMAKE构建库时的所有CUDA符号(函数调用等(。
如果您需要可分离的汇编设备链接到之前发生 通过共享库或可执行文件的消费,您可以明确 请求CMAKE通过设置目标属性来调用设备链接 cuda_resolve_device_symbols
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 使用cmake错误链接boost日志
- 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用):在 Macbook 上
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- 静态库中的 g++ 错误链接函数
- 未定义的参考错误链接天然函数Android
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- QT Q_PROPERTY错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- OSX MOJAVE -LD:架构X86_64 clang找不到符号:错误:链接器命令失败,出口代码1
- C 错误链接器命令失败了出口代码1(使用-V查看调用)
- LD:架构x86_64 clang找不到符号:错误:链接器命令失败,出口代码1(使用-v to See
- 聚输出错误 - 链接列表
- Xcode链接器错误:链接器命令失败,退出代码为1(使用-v查看调用)
- 尝试构建C DLIB示例无法与数百个未定义的参考错误链接