Я использую CUDA 6.5 на Visual Studio 2013 x64.
У меня есть проект статической библиотеки VC ++ с именем MyLib, который связан с исполняемым проектом консоли MyClient x64. Я добавил настройку сборки CUDA 6.5 в оба проекта. Кроме того, я захожу в Свойства конфигурации -> CUDA C / C ++ и установил «Целевую машинную платформу» как 64-битную для этих двух проектов, так как хочу скомпилировать их для платформы x64.
Я добавил файлы MyCUDACode.cpp и MyCUDACode.h в проект MyLib и пометил их тип элемента как CUDA C / C ++ вместо oc C / C ++ компилятор. MyCUDACode.cpp имеет ряд функций, которые вызывают функции API CUDA. Кроме того, MyCUDACode.h ссылается на файлы cuda.h и cuda_runtime.h.
MyClient связан с MyLib. Теперь я получаю две ошибки компиляции:
Во-вторых, я получаю неразрешенные внешние ошибки символов при связывании
MyClient с MyLib. Вот вывод журнала:
—— Начата сборка: Проект: MyLib, Конфигурация: Выпуск x64 ——
1> C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ BuildCustomizations \ CUDA 6.5.targets (412,9): ошибка MSB3191: невозможно создать каталог «x64 \ Release \ D: \ GitHub \ SRC \ хелперы \». Формат данного пути не поддерживается.
2> —— Началась сборка: Проект: MyClient, Конфигурация: Выпуск x64 ——
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaGetDeviceCount
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaDeviceCanAccessPeer
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaGetDeviceProperties
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaSetDevice
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaDeviceDisablePeerAccess
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaDeviceReset
2> MyLib.lib (MyCUDACode.obj): ошибка LNK2001: неразрешенный внешний символ cudaDeviceEnablePeerAccess
2> C: … \ visual studio 2013 \ Projects \ Prj \ x64 \ Release \ MyClient.exe: фатальная ошибка LNK1120: 7 неразрешенных внешних проблем
Я пробовал оба режима выпуска и отладки, но я получаю ту же ошибку.
Я просто воспроизвожу шаги по устранению ошибок:
[ОБНОВИТЬ]: Недавно я нашел лучшее решение для этой проблемы MSB3191: Невозможно создать каталог. Формат указанного пути не поддерживается.. Это исправление работает без необходимости перемещения файлов cu в папку проекта VS. Для этого откройте файл «C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ BuildCustomizations \ CUDA 6.5.targets», и перейдите на линию обидчика (в данном случае 412). Эта строка содержит следующий раздел xml:
<MakeDir
Condition="'%(CudaCompile.ExcludedFromBuild)' != 'true'"Directories="%(CudaCompile.DepsOutputDir)" />
Как вы можете видеть, это своего рода директива, которая указывает системе сборки создать папку для компилируемых файлов cuda. Для имени папки используется свойство CudaCompile.DepsOutputDir. Теперь откройте файл: «C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ BuildCustomizations \ CUDA 6.5.props». Этот реквизитный файл определяет значения свойств, используемых в целевом файле. Теперь поиск по слову DepsOutputDirв этом файле реквизита. Есть только раздел XML, который определяет и ссылается на это ключевое слово:
<!-- Miscellaneous -->
<DepsOutputFile>%(Filename)%(Extension).deps</DepsOutputFile>
<DepsOutputDir>$(IntDir)%(RelativeDir)</DepsOutputDir>
<DepsOutputPath>%(DepsOutputDir)%(DepsOutputFile)</DepsOutputPath>
Теперь, чтобы окончательно исправить проблему MSB3191, просто удалите переменную % (RelativeDir) сверху раздел xml и сохраните файл props (для этого потребуются права администратора)
Чтобы устранить ошибку: LNK2001: неразрешенный внешний символ, следовать Настройки для линкера раздел в этом сообщение