cmake_minimum_required(VERSION 3.18) project(DontResolveDeviceSymbols CUDA) # Find nm and dumpbin if(CMAKE_NM) set(dump_command ${CMAKE_NM}) set(dump_args --defined-only) set(symbol_name cudaRegisterLinkedBinary) else() include(GetPrerequisites) message(STATUS "calling list_prerequisites to find dumpbin") list_prerequisites("${CMAKE_COMMAND}" 0 0 0) if(gp_dumpbin) set(dump_command ${gp_dumpbin}) set(dump_args /SYMBOLS) set(symbol_name nv_fatb) endif() endif() #Goal for this example: # Build a static library that defines multiple methods and kernels that # use each other. # Don't resolve the device symbols in the static library # Don't resolve the device symbols in the executable library # Verify that we can't use those device symbols from anything set(CMAKE_CXX_STANDARD 11) set(CMAKE_CUDA_STANDARD 11) set(CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS OFF) add_library(CUDANoDeviceResolve SHARED file1.cu) set_target_properties(CUDANoDeviceResolve PROPERTIES CUDA_SEPARABLE_COMPILATION ON POSITION_INDEPENDENT_CODE ON) if(MSVC) target_link_options(CUDANoDeviceResolve PRIVATE "/FORCE:UNRESOLVED") endif() if(dump_command) add_custom_command(TARGET CUDANoDeviceResolve POST_BUILD COMMAND ${CMAKE_COMMAND} -DDUMP_COMMAND=${dump_command} -DDUMP_ARGS=${dump_args} -DSYMBOL_NAME=${symbol_name} -DTEST_LIBRARY_PATH=$ -P ${CMAKE_CURRENT_SOURCE_DIR}/verify.cmake ) endif()