Visual studio 14.0 LNK2001(未解析的外部符号)与 OpenCL

Visual studio 14.0 LNK2001 (unresolved external symbol ) with 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

我已经添加了库和头文件的路径。我对这些错误感到困惑。我能做些什么来解决这个问题?

----------------------------更新---------------- --------------

好的,正如 Hadi Brais 所说,我将其添加到附加依赖项中。所有旧错误都消失了。但是又来了一个新的。

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++ 构建的。这很混乱。有人知道如何处理这个吗?非常感谢!!!

更新: 根据中的讨论,这个问题是由VS2015中stdin/stdout/stderr的重新定义引起的,而Altera OpenCL库是用VS2010构建的。函数调用的未匹配导致它在链接阶段失败。

可以包含 legacy_stdio_definitions.lib 以解决 __imp_vfprintf 链接问题,但不能包含 __imp__iob_func。

根据与一位 MS 工程师的讨论,有两种方法可以解决这个问题:1. 将库 ps 编码为一个 DLL,该 DLL 与阿泰拉。 2. 等待 Altera 发布更新的库。

希望对您有所帮助。


只想跟进您的问题。 您 运行 正在使用 Visual Studio 2015 进行 Altera OpenCL 设计吗? 我收到与您提到的相同的错误。你修好了吗? Thx(ps:似乎相同的设计可以 运行 与 VS2013 但在 VS2015 上失败)

要使在VS2015下构建的项目正常运行,需要2个步骤。我使用 VS2010 vector_add 项目转换为 VS2015,所有 AOCL 任务包含在 *.vcxproj 生成编译和 link 配置中。

1.构建主机可执行文件

在 VS2015 中添加到链接器 -> 输入 -> 附加依赖项:

OpenCL.lib
legacy_stdio_definitions.lib

在此阶段,您应该能够 运行 托管可执行文件,但不会检测到 Altera 平台。

2。将 Altera OpenCL 平台添加到 Windows 以便可以通过以下方式查询 任何 OpenCL SDK

从 "Altera SDK for OpenCL Programming Guide" 关注 "Linking to the ICD Loader Library on Windows":

特别是第 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 中(注意:由于某些原因 %ALTERAOCLSSDKROOT% 对我不起作用,所以路径是硬编码的): C:\altera.0\hld\bin;C:\altera.0\hld\host\windows64\bin.

我建议首先让它与简单的 Altera 示例项目一起工作,即 "vector_add"。