Список причин для LNK2038, MSVS2017 MAGMA - PullRequest
0 голосов
/ 03 ноября 2018

Моя цель состоит в том, чтобы скомпилировать (каламбур не предназначен) список причин для LNK2038 «обнаружено несоответствие для« _ITERATOR_DEBUG_LEVEL »: значение« 0 »не соответствует значению« 2 »», которое другие могут методично использовать для отладки своих собственных ситуаций , моя ситуация разрешится

Моя ситуация:

Требования:

  • Windows 10
  • CMake
  • MSVS 2017
  • Intel Paralax Studio XE
  • 1018 * CUDA *

Воспроизвести:

  1. Скачать MAGMA
  2. Запустить CMake GUI

    • Ручная настройка GPU_TARGET=Pascal (Моя карта: GeForce GTX 1070 Compute Capacity: 6.1)
    • Устанавливать вручную MKLROOT=D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl (как указано в README-Windows)
    • LAPACK_LIBRARIES: используйте https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor для определения

      • Мой выбор
      • D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl/lib/intel64_win/mkl_intel_lp64.lib;D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl/lib/intel64_win/mkl_intel_thread.lib;D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl/lib/intel64_win/mkl_core.lib;D:/Program Files (x86)/IntelSWTools/compilers_and_libraries_2019.0.117/windows/compiler/lib/intel64_win/libiomp5md.lib
  3. Из сгенерированного решения VS скомпилируйте в режиме отладки magma и magma_sparse проектов (не нужно компилировать более 600 тестовых проектов)

  4. В отдельную папку поместите пример кода и CMakeLists.txt

    add_executable(magma-test example_sparse.cpp)
    
    find_package( CUDA ) # just to set CUDA_INCLUDE_DIRS
    
    target_include_directories(magma-test PUBLIC D:/Work/Magma/magma-2.4.0/include D:/Work/Magma/magma-2.4.0/sparse/include ${CUDA_INCLUDE_DIRS})
    target_link_libraries(magma-test debug D:/Work/Magma/magma-2.4.0/build/lib/Debug/magma.lib debug D:/Work/Magma/magma-2.4.0/build/lib/Debug/magma_sparse.lib)
    
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
    
  5. Запустить CMake (настроить, сгенерировать)

  6. Откройте решение VS и скомпилируйте в Режим отладки

Проблемный результат:

1>magma_sparse.lib(magma_sparse_generated_djacobisetup.cu.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in magma.lib(interface.obj)

1>magma_sparse.lib(magma_sparse_generated_djacobisetup.cu.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' in magma.lib(interface.obj)

----------

Что нужно проверить на LNK2038:

  1. Все зависимости (* .lib файлы) были скомпилированы с одинаковыми флагами "Отладка / Выпуск"
    • Дважды проверьте зависимости, которые фактически используются при щелчке правой кнопкой мыши на вашем проекте -> Свойства -> Компоновщик -> Ввод -> Дополнительные зависимости
    • Перейдите в каждый зависимый проект и в свой проект и проверьте флаги сборки, щелкнув правой кнопкой мыши Проект -> Свойства -> C / C ++ -> Генерация кода -> Библиотека времени выполнения

1 Ответ

0 голосов
/ 07 ноября 2018

CMakeLists.txt, который "разрешает" вышеуказанную ошибку, компилирует и запускает:

add_executable(magma-test example_sparse.cpp)

find_package( CUDA ) 
set( MKLROOT "D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl" )
set( LAPACK_LIBRARIES 
   "D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl/lib/intel64_win/mkl_intel_lp64.lib"
   "D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl/lib/intel64_win/mkl_intel_thread.lib"
   "D:/Program Files (x86)/IntelSWTools/parallel_studio_xe_2019.0.045/compilers_and_libraries_2019/windows/mkl/lib/intel64_win/mkl_core.lib"
   "D:/Program Files (x86)/IntelSWTools/compilers_and_libraries_2019.0.117/windows/compiler/lib/intel64_win/libiomp5md.lib")

target_include_directories(magma-test PUBLIC 
   "D:/Work/Magma/magma-2.4.0/include" 
   "D:/Work/Magma/magma-2.4.0/sparse/include" 
   ${CUDA_INCLUDE_DIRS}
   ${MKLROOT}/include)
target_link_libraries(magma-test 
   ${CUDA_CUDART_LIBRARY}
   ${CUDA_CUBLAS_LIBRARIES}
   ${CUDA_cusparse_LIBRARY}
   ${LAPACK_LIBRARIES}
   debug D:/Work/Magma/magma-2.4.0/build/lib/Debug/magma.lib 
   debug D:/Work/Magma/magma-2.4.0/build/lib/Debug/magma_sparse.lib
   optimized D:/Work/Magma/magma-2.4.0/build/lib/Release/magma.lib 
   optimized D:/Work/Magma/magma-2.4.0/build/lib/Release/magma_sparse.lib)

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

Библиотеки CUDA и MKL, которые MAGMA использует при компиляции, по-видимому, также должны быть предоставлены для кода, использующего библиотеки MAGMA

РЕДАКТИРОВАТЬ: Подождите, нет. Он компилируется и работает в Release, но не в Debug.

...