【问题标题】:Dependence on msvcr120d.dll Visual Studio 2015 (Intel TBB)对 msvcr120d.dll Visual Studio 2015 (Intel TBB) 的依赖
【发布时间】:2015-08-21 03:33:06
【问题描述】:

为了让 Intel TBB(线程构建块)与 Visual Studio 2015 一起工作,我尝试了以下方法(因为默认情况下,构建的二进制文件仅适用于 vs2013)。

使用 Visual Studio 2015 编译英特尔 TBB -

  1. Here下载Intel TBB源代码。
  2. 解压,
  3. 用路径tbb<version>\build\VS2010打开VS2010解决方案makefile.sln
  4. 批准转换项目文件以使用 Visual 2015 工具包
  5. 选择调试配置和 x64 平台和构建。 (请注意,如果之前的构建已经完成,则重新构建(清理并构建)。
  6. 将dll、pdb、lib、exp、def文件从tbb<version>\build\VS2010\intel64\Debug复制到tbb<version>\lib\Debug

创建新的空 Visual C++ 项目

对调试进行以下更改,x64 配置

  1. 添加额外的包含目录tbb<version>\include
  2. 添加其他库目录tbb<version>\lib\Debug
  3. 添加以下库依赖

    tbbmalloc_debug.lib
    tbbmalloc_proxy_debug.lib
    tbb_debug.lib
    
  4. 选择Debug, x64 配置和构建。构建成功。

用于测试的代码如下:

#include <iostream>
#include <vector>
#include <random>

#include <tbb/parallel_for.h>

// #include "..\Headers\MexMem.hpp"

using namespace std;

int main() {

    std::vector<int> A(100, 0);
    std::vector<int> B(100, 0);
    std::vector<int> C(100, 0);

    mt19937_64 RandNoEngine;
    uniform_int_distribution<int> RandNoGenerator;

    for (int i = 0; i < A.size(); ++i) {
        A[i] = RandNoGenerator(RandNoEngine);
        B[i] = RandNoGenerator(RandNoEngine);
    }

    tbb::parallel_for(tbb::blocked_range<int>(0, 100), [&](tbb::blocked_range<int> &Range) {
        int beg = Range.begin();
        int end = Range.end();
        for (int i = beg; i < end; ++i) {
            C[i] = A[i] * B[i];
        }
    });
    cout << A[30] << " * " << B[30] << " = " << C[30] << endl;
    system("pause");
    return 0;
}

按F5进行调试,出现程序无法启动的错误,因为您的计算机中缺少MSVCP120D.dll。尝试重新安装程序以解决此问题。 下一条消息与 MSVCR120D.dll 相关。请注意,这是在使用 Visual 2015 构建所有内容(包括 TBB 库)之后发生的。

其他信息

使用 Dependancy Walker (depends.exe) 进行快速分析,得出以下结果:

tbb_debug.lib的依赖如下

- TBB_DEBUG.dll 
   - KERNEL32.DLL
   - MSVCP140D.DLL
   - VCRUNTIME140D.DLL
   - UCRTBASED.DLL

但是tbb_debug.lib的依赖关系如Exe(上述程序的exe)如下:

- TBB_EXPERIMENT.EXE
   - TBB_DEBUG.dll
      ? MSVCP120D.DLL
      ? MSVCR120D.DLL
      - KERNEL32.

为什么会出现差异?有没有办法获得更多相关信息,最后,有没有办法在 Visual Studio 2015 上正确编译和调试 Intel TBB?

【问题讨论】:

  • 你检查过 Depends to DLL 中的完整路径吗?这看起来像是在加载错误的 TBB_DEBUG.dll。
  • @1201ProgramAlarm 啊是的。情况似乎确实如此。我认为这是因为我最近升级了 Visual Studio,但仍有一些东西迫使 Visual Studio 进入 Composer Studio Libs。我会调查是什么原因造成的,看看我能不能解决它并让你知道。
  • @1201ProgramAlarm 你一针见血。在处理以前的版本时,我将英特尔 TBB 的可再发行库文件夹包含在路径环境变量中,这会导致 Visual Studio 绕过我告诉它查看的文件夹。请发表您的评论作为答案,我会将其标记为已接受。

标签: c++ visual-c++ visual-studio-2015 tbb


【解决方案1】:

这看起来像是在加载错误的 TBB_DEBUG.DLL。在 Dependency Walker 中检查 DLL 的完整路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多