Visual studio 14.0 LNK2001 (неразрешенный внешний символ) с OpenCL
Я новичок в OpenCL. Когда я попробовал примеры с сайта Altera, я получил несколько ошибок LNK2001 следующим образом
Severity Code Description Project File Line
Error LNK2001 unresolved external symbol __imp_sprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_hal_mmd.obj) 1
Error LNK2001 unresolved external symbol __imp___iob_func hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_hal_mmd.obj) 1
Error LNK2001 unresolved external symbol __imp_fprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_hal_mmd.obj) 1
Error LNK2001 unresolved external symbol __imp_sprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_mem.obj) 1
Error LNK2001 unresolved external symbol __imp___iob_func hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_offline_hal.obj) 1
Error LNK2001 unresolved external symbol __imp__set_output_format hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_printf.obj) 1
Error LNK2001 unresolved external symbol __imp_fprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_profiler.obj) 1
Error LNK2001 unresolved external symbol __imp_sprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_program.obj) 1
Error LNK2001 unresolved external symbol __imp___iob_func hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_support.obj) 1
Error LNK2001 unresolved external symbol __imp_vsprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_support.obj) 1
Error LNK2001 unresolved external symbol __imp_vsnprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_support.obj) 1
Error LNK2001 unresolved external symbol __imp_vfprintf hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_support.obj) 1
Error LNK2001 unresolved external symbol __imp___iob_func hello_world C:\Users\S_KW\OpenCL\hello_world\alteracl.lib(acl_threadsupport.obj) 1
Error LNK1120 8 unresolved externals hello_world C:\Users\S_KW\OpenCL\hello_world\bin\hello_world.exe 1
Error IntelliSense: argument of type "void (*)(const char *errinfo, const void *, size_t, void *)" is incompatible with parameter of type "void (__stdcall *)(const char *, const void *, size_t, void *)" hello_world c:\Users\S_KW\OpenCL\hello_world\host\src\main.cpp 145
Warning LNK4044 unrecognized option '/LC:\Users\S_KW\arrow_c5sockit_bsp\arm32\lib'; ignored hello_world C:\Users\S_KW\OpenCL\hello_world\LINK 1
Warning LNK4044 unrecognized option '/lalterahalmmd'; ignored hello_world C:\Users\S_KW\OpenCL\hello_world\LINK 1
Warning LNK4044 unrecognized option '/lalterammdpcie'; ignored hello_world C:\Users\S_KW\OpenCL\hello_world\LINK 1
Error LNK2001 unresolved external symbol __imp_vsnprintf hello_world C:\Users\S_KW\OpenCL\hello_world\MSVCRT.lib(vsnprintf.obj) 1
Error LNK2001 unresolved external symbol __imp__vsnprintf hello_world C:\Users\S_KW\OpenCL\hello_world\MSVCRT.lib(vsnprintf.obj) 1
Error LNK2001 unresolved external symbol __imp___iob_func hello_world C:\Users\S_KW\OpenCL\hello_world\pkg_editor.lib(pkg_editor.obj) 1
Error LNK2001 unresolved external symbol __imp_fprintf hello_world C:\Users\S_KW\OpenCL\hello_world\pkg_editor.lib(pkg_editor.obj) 1
Я уже добавил путь к файлам libs и head. Я смущен этими ошибками. Что я могу сделать, чтобы решить это?
----------------------------ОБНОВИТЬ--------------------- ---------
Хорошо, как сказал Хади Брайс, я добавил это к дополнительным зависимостям. И все старые ошибки исчезли. Но наступает новый.
Severity Code Description Project File Line
Error LNK1120 1 unresolved externals hello_world C:\Users\S_KW\OpenCL\hello_world\bin\hello_world.exe 1
Error LNK2001 unresolved external symbol __imp_sprintf hello_world C:\Users\S_KW\OpenCL\hello_world\OpenCL.lib(icd_windows.obj) 1
Warning LNK4044 unrecognized option '/LC:\Users\S_KW\arrow_c5sockit_bsp\arm32\lib'; ignored hello_world C:\Users\S_KW\OpenCL\hello_world\LINK 1
Warning LNK4044 unrecognized option '/lalterahalmmd'; ignored hello_world C:\Users\S_KW\OpenCL\hello_world\LINK 1
Warning LNK4044 unrecognized option '/lalterammdpcie'; ignored hello_world C:\Users\S_KW\OpenCL\hello_world\LINK 1
Я думаю, что это как-то связано с OpenCL.lib. Кажется, что lib не может видеть функцию printf. Но я думаю, что printf встроен в C++. Это сбивает с толку. Кто-то знает, как справиться с этим? Большое спасибо!!!
2 ответа
Обновление: согласно обсуждению в этой ссылке, эта проблема вызвана переопределением stdin/stdout/stderr в VS2015, а библиотеки Altera OpenCL были собраны с VS2010. Несоответствие вызова функции приводит к сбою на этапе связывания.
Legacy_stdio_definitions.lib может быть включен для решения ссылки __imp_vfprintf, но не __imp__iob_func.
Согласно одному из обсуждений с инженером MS, есть два способа преодолеть это: 1. инкапсулировать lib в DLL, которая связана с тем же CRT, который использовался Altera. 2. дождаться более новой версии libs от Altera.
Надеюсь, это поможет.
просто хотел бы продолжить вашу проблему. Используете ли вы проекты Altera OpenCL с Visual Studio 2015? Я получаю ту же ошибку, что вы упомянули. Вы уже исправили это? Thx (PS: кажется, тот же дизайн может работать с VS2013, но не удалось на VS2015)
Есть 2 шага, чтобы проект, построенный под VS2015, работал. Я использовал VS2010 vector_add
проект конвертируется в VS2015 и все AOCL
задачи, включенные в *.vcxproj, генерирующие компиляцию и конфигурацию ссылок, остаются там.
1. Создайте исполняемый файл хоста
В VS2015 добавьте в компоновщик -> Ввод -> Дополнительные зависимости:
OpenCL.lib
legacy_stdio_definitions.lib
На этом этапе вы сможете запустить исполняемый файл хоста, но платформа Altera не будет обнаружена.
2. Добавьте платформу Altera OpenCL в Windows, чтобы ее можно было запрашивать любым OpenCL SDK
Выполните "Связывание с библиотекой загрузчика ICD в Windows" из "Руководства по программированию Altera SDK для OpenCL":
В частности, пункт 2b говорит о добавлении значений в реестр Windows:
[HKEY_LOCAL_MACHINE\SOFTWARE\Altera\OpenCL\Boards]
"c:\\board_vendor a\\my_board_mmd.dll"=dword:00000000
а также
[HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors]
"alteracl_icd.dll"=dword:00000000
Если платформу Altera OpenCL по-прежнему не удается найти, убедитесь, что указанные ниже пути указаны в PATH (примечание: по какой-то причине%ALTERAOCLSDKROOT% не работает для меня, поэтому пути жестко запрограммированы): C:\altera\15.0\hld\bin;C:\altera\15.0\hld\host\windows64\bin
,
Я предлагаю сначала заставить его работать с простым примером проекта Altera, то есть "vector_add".