代码之家  ›  专栏  ›  技术社区  ›  PStarczewski

0xc000007b Windows上OpenCL库的加载时间错误

  •  0
  • PStarczewski  · 技术社区  · 7 年前

    0xc000007b 错误。

    1. 我正在使用 Visual Studio 15 2017
    2. 整个解决方案是为 x64
    3. x64个 OpenCL 工作完美无瑕。
    4. 我正在使用 Intel SDK platform
    5. cl.h 标题,链接 CMake 开放运算语言
    6. 我正在使用cmake进行构建,但在这一点上(我真的尝试了一切),任何解决方案都会让我满意,甚至手动更改VS中的属性。

    我知道那个错误代码 0xc000007b 是由于将x32 dll加载到x64项目中引起的,但是我不认为这是一个问题。

    主要制造商:

    find_package(OpenCL REQUIRED)
    
    # include directories
    include_directories(${OpenCL_INCLUDE_DIRS})
    message(STATUS "opencl_include: " ${OpenCL_INCLUDE_DIRS})
    
    # link libraries
    link_directories(${OpenCL_LIBRARIES})
    message(STATUS "opencl_lib: " ${OpenCL_LIBRARIES})
    

    add_executable(server ${SRC_HEADERS} ${SRC})
    
    target_link_libraries(server
      ${OpenCL_LIBRARY}
    )
    

    CMake输出:

    opencl_include: C:/Intel/OpenCL/sdk/include
    opencl_lib: C:/Intel/OpenCL/sdk/lib/x64/OpenCL.lib
    

    Build/bin/Debug 目录OpenCL.dll正确创建。我尝试过将文件压缩到源目录,在cmake中手动链接,并在visualstudio中设置属性,而不是在cmake中。还是一样的问题。

    我缩短了代码,只显示重要的部分,如果我错过了任何相关的让我知道,我会把它纳入我的问题。

    编辑:

    我也尝试过链接x86OpenCL.lib文件版本,在这种情况下会出现编译错误:

    未解析的外部符号

    1 回复  |  直到 7 年前
        1
  •  1
  •   PaulMcKenzie    7 年前

    错误可能有多种原因,但要开始故障排除,可以验证以下内容:

    1) 是否实际构建了64位DLL而不是32位DLL,以及

    对于1),可以使用 dumpbin Dependency Walker 验证正在生成的DLL是否为64位。

    如果在应用步骤1)之后,您已经验证了DLL是64位的,那么接下来要验证的是步骤2)。由于您在注释中提到已验证正在生成的DLL是64位的,因此应尝试步骤2)。


    对于步骤2),当Windows尝试在运行时加载DLL时,将加载Windows遇到的与DLL文件名匹配的第一个名称,而不管它是否是正确的DLL(按位级别)。当有2个(或更多)DLL具有相同的确切名称,但具有不同的“位”级别(即32位或64位)时,就会出现问题。

    如果您正在运行一个64位的应用程序,而Windows试图加载一个32位的DLL,那么您将得到 0xc0000007b 错误——反之亦然,将64位DLL加载到32位应用程序中会导致相同的问题。

    This link 描述Windows在加载DLL时使用的搜索逻辑。请确保Windows不会无意中选取与名称匹配但不是相同应用程序位级别的DLL。

    对于大多数不常见的情况,此错误是在系统路径上发现不正确的DLL,因此Windows会尝试加载它。但正如链接所示,还有其他一些情况会导致Windows选择一个DLL(数量太多了,所以请查看发布的链接)。


    不幸的是,Windows就是这样工作的,所以当您有一个32位和64位版本的DLL具有相同的名称时要小心,并且其中一个可能被Windows加载。

    推荐文章