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".

Другие вопросы по тегам