nvlink fatal : elfLink linker library load error

Hello,

I am trying to compile a project with cuda. The cuda part of the code compiles correctly, but there is an error in the linking phase.

nvlink fatal   : elfLink linker library load error
    • Verified that nvcc works by compiling a simple CUDA program (Hello, CUDA!).
  • Checked that the required libraries (librt.a, libdl.a, libpthread.a) exist in /usr/lib/x86_64-linux-gnu/.
  • Cleared the CMake cache and re-ran the configuration.

Despite these steps, the linking phase still fails. Could this be due to an issue with library compatibility, or is there something missing in my CMakeLists.txt?

Thank you in advance!

Best regards,
Rafael Scatena

* CUDA Version: 12.0.140
* Driver Version: 550.120
* GPU: NVIDIA RTX 5000 Ada
* CMake Version: 3.28.3
* GCC Version 12.3.0
* OS: Ubuntu 22.04

Error:
        [ 90%] Linking CUDA device code CMakeFiles/PRISMAMESH.dir/cmake_device_link.o
        /usr/bin/cmake -E cmake_link_script CMakeFiles/PRISMAMESH.dir/dlink.txt --verbose=1
        /usr/bin/nvcc -forward-unknown-to-host-compiler  -arch=native  -dlto -Xcompiler=-fPIC -Wno-deprecated-gpu-targets -shared -dlink --options-file CMakeFiles/PRISMAMESH.dir/deviceObjects1.rsp -o CMakeFiles/PRISMAMESH.dir/cmake_device_link.o --options-file CMakeFiles/PRISMAMESH.dir/deviceLinkLibs.rsp
        nvlink warning : Skipping incompatible '/usr/lib/x86_64-linux-gnu/librt.a' when searching for -lrt
        nvlink warning : Skipping incompatible '/usr/lib/x86_64-linux-gnu/libdl.a' when searching for -ldl
        nvlink warning : Skipping incompatible '/usr/lib/x86_64-linux-gnu/libpthread.a' when searching for -lpthread
        nvlink fatal   : elfLink linker library load error
        make[2]: *** [CMakeFiles/PRISMAMESH.dir/build.make:490: CMakeFiles/PRISMAMESH.dir/cmake_device_link.o] Erro 1
        make[2]: Saindo do diretório '/home/3484681/Área de trabalho/PRISMAMESH/CUDAOCTREE/PRISMAMESH3'
        make[1]: *** [CMakeFiles/Makefile2:86: CMakeFiles/PRISMAMESH.dir/all] Erro 2
        make[1]: Saindo do diretório '/home/3484681/Área de trabalho/PRISMAMESH/CUDAOCTREE/PRISMAMESH3'
        make: *** [Makefile:94: all] Erro 2

CmakeLists file:

      ####################### CMAKE CONFIG 
      
      
      set(CUDA_USE_STATIC_CUDA_RUNTIME ON)
      
      
      cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
      set(CMAKE_CUDA_ARCHITECTURES "native")
      project(PRISMAMESH LANGUAGES CXX CUDA)
      project(PRISMAMESH)
      set(CMAKE_CXX_STANDARD 17)
      set(CMAKE_CXX_STANDARD_REQUIRED ON)
      set(CMAKE_CXX_ENTENSIONS OFF)
      set(CMAKE_CXX_FLAGS "")
      set(CMAKE_CUDA_FLAGS "")
      set(CMAKE_CUDA_COMPILER_LAUNCHER "")
      set(CMAKE_VERBOSE_MAKEFILE ON)
      
      
      
      set(CMAKE_C_COMPILER /usr/bin/gcc)
      set(CMAKE_CXX_COMPILER /usr/bin/g++)
      
      
      # Suppress warnings for GCC and Clang
      if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
          add_compile_options(-w)
      endif()
      
      ####################### APPEND PATH TO CMAKE LIBRARIES 
      
          list(APPEND CMAKE_PREFIX_PATH 
              #USR
              "/usr/lib"         "/usr/lib32"         "/usr/lib64" 
              "/usr/include"     "/usr/lib64" 
              # OPENMPI
              "/usr/lib/x86_64-linux-gnu/openmpi/" 
              "/usr/lib/x86_64-linux-gnu/openmpi/include" 
              "/usr/lib/x86_64-linux-gnu/openmpi/lib" 
              "/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi"
              "/usr/lib/x86_64-linux-gnu/openmpi/lib"
              # MPICXX
              "/usr/bin/mpicxx"         "/usr/bin/mpicc"        "/usr/lib/x86_64-linux-gnu/mpich/include"
              # OpenGL
              "/usr/include/GL/"
              # Boost        
              "/home/3484681/support/boost/boost_1_87_0/libs"
              "/home/3484681/support/boost/boost_1_87_0"
              # CUDA
              "/usr/local/cuda-12.5/targets/x86_64-linux/lib"    
              "/usr/lib/cuda/include"    
              "/usr/local/cuda-12.5/include"
              "/usr/local/cuda-12.5/bin"        "/usr/local/cuda-12.5"
              "/usr/lib/x86_64-linux-gnu/"
              )
      
          ####################### CUDA
      
      
          # Find CUDA
           find_package(CUDAToolkit REQUIRED)
           
           if(CUDAToolkit_FOUND)
              message(STATUS "CUDA Toolkit found!")
              message(STATUS "CUDA Version: ${CUDAToolkit_VERSION}")
          else()
              message(FATAL_ERROR "CUDA Toolkit not found.")
          endif()
      
           
       
          set(CUDA_PROPAGATE_HOST_FLAGS OFF)
          set(CUDA_64_BIT_DEVICE_CODE ON)
      
          set(CUDA_NVCC_FLAGS dc -dlto)
       
           # Check if CUDA is found and print its version
          if(CUDAToolkit_FOUND)
              message(STATUS "CUDA Toolkit found!")
              message(STATUS "CUDA Version: ${CUDAToolkit_VERSION}")
          else()
              message(FATAL_ERROR "CUDA Toolkit not found.")
          endif()
      
           
          enable_language(CUDA)
          set(CUDA_HOST_COMPILATION_CPP ON)
      
      
          ####################### ADD EXECUTABLE
      
      
          set(CUDA_SOURCES
              PRISMAMESH.cxx
              CudaOctreeAux.cu
                 )
      
      
          add_executable(PRISMAMESH PRISMAMESH.cxx ${CUDA_SOURCES})
      
                         
          target_compile_options(PRISMAMESH PRIVATE     
          #$<$<COMPILE_LANGUAGE:CUDA>:-Xcompiler=-fPIC>
          #$<$<COMPILE_LANGUAGE:CUDA>:-rdc=true>
          $<$<COMPILE_LANGUAGE:CUDA>:-m64>
      )
      
          set_target_properties(PRISMAMESH PROPERTIES 
              CUDA_SEPARABLE_COMPILATION ON
              CUDA_RESOLVE_DEVICE_SYMBOLS ON
              INTERPROCEDURAL_OPTIMIZATION TRUE
          )
      
              target_include_directories(PRISMAMESH PRIVATE  ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/include  ${Boost_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}  ${CUDAToolkit_INCLUDE_DIR}
              )
              
              target_link_libraries(PRISMAMESH PRIVATE ${CUDAToolkit_LIBRARIES})
      
          set(CMAKE_DISABLE_PRECOMPILE_HEADERS TRUE)

Hi,

I have the same issue. Actually, it seems that it comes from some libs (including rt, dl and pthread, but also anl and util) have been included into glibc. Then it is no longer necessary to link with these libs and these libs are empty and just contains

!<arch>

see here

I have not yet found how to tell nvlink not to link with these libs.