Win10+mingw64+VSCode条件下编译和使用TBB
Win10+mingw64条件下编译和使用TBB
本文记录在Win10系统中使用mingw64对并行库Intel TBB进行编译和使用的步骤。本文时间为2020年3月12日,以上各个软件的版本均为当前较新版本。
编译TBB
- TBB下载地址https://github.com/intel/tbb。在其中选择了ZIP格式下载。
下载完毕后解压后得到TBB的文件夹如下图。
- 执行编译命令。打开命令行,进入TBB文件夹,执行命令mingw32-make compiler=gcc arch=intel64。
注意本文使用的是mingw64,如果是MinGW,则使用的编译命令应该是mingw32-make compiler=gcc arch=ia32 runtime=mingw tbb。mingw64和MinGW这二者应该不能混淆。
当然,作为小白我要说一下,要像这样使用mingw32-make,需要事先把mingw64下的bin文件夹加入环境变量Path。 - 编译成功。在我这,以上一条命令就可以完成编译。编译后将生成一个文件夹,位置及内容见下图。在此提一下,这个文件夹中的内容应该是我们以后使用TBB的程序在运行时会需要的动态库等。我觉得其中最重要的文件应该是tbb.dll,不知道别的文件是不是也必不可少。
环境变量的设置
以下环境变量及相关作用由TBB编译后生成的文件夹中的 tbbvars.bat 里的内容猜想及测试而来。
(文件夹 D:\Program Files\tbb-tbb_2020\build\windows_intel64_gcc_mingw8.1.0_release)
- CPATH变量。由于在编辑及编译的过程中需要使用tbb提供的头文件,为了正确地找到这些头文件,一种比较一劳永逸的办法是将tbb的头文件所在的目录添加到环境变量CPATH中。(设置这个变量后,在编译时就不需要使用 -I 选项来给g++命令指定头文件了。这个环境变量从前没有用过,看样子可能是 mingw64 编译时会自动去找这个变量所指的文件夹中去找头文件?)
- LIBRARY_PATH变量。编译过程中我们写的tbb程序还依赖于编译生成的 tbb.dll 等文件,将这些文件所在的目录 D:\Program Files\tbb-tbb_2020\build\windows_intel64_gcc_mingw8.1.0_release 添加到LIBRARY_PATH,则可以在使用g++命令时不必再用 -L 选项来指定使用的动态库。
- Path变量。我们写的tbb程序在运行时同样要依赖于 tbb.dll 等,为了在运行我们的程序时让系统自动识别加载这些库,可以将 tbb.dll 所在的目录加入Path变量(放在PATH中最上面最好)。这一步设置后,在程序运行时,将从Path变量中找所需的依赖库,如果不如此设置,应该是需要在g++ 命令中使用 -Wl,-rpath= 选项来设置程序启动时的路径,从而达到相同的效果(不过我不了解,万一我们编的程序除了tbb库外还需要别的库,-Wl有没有办法处理。。。)。
如上设置环境变量后,可以使得编译和运行较为方便。
TBB使用示例
- 代码编辑。创建文件a.cpp,添加代码内容如下。(内容来自https://blog.csdn.net/dwosion/article/details/72724371)
#include <tbb/tbb.h>
#include <iostream>
using namespace std;
using namespace tbb;
int main()
{
parallel_for(0, 10, [](int num) {cout << num << ":hello tbb " << endl; });
getchar();
return 0;
}
- 编译。进入代码所在文件夹,执行命令 g++ a.cpp -ltbb进行编译。因为之前设置过相关的环境变量,在此处不需要 -I、-L、-Wl等命令,给我们的编译带来了一定的方便。
编译过程中出现一个warning,我在初学阶段,并不知道是什么意思,不过发现可执行文件a.exe已经生成,并可以运行。
- 运行。直接双击生成的a.exe,应该就可以运行了。这里应该是Path变量中的库目录起了作用。
总结与展望
- 使用mingw64可以对TBB源码进行编译,在适当地设置环境变量后,可以帮助我们方便地进行并行程序的编写。
- 各个环境变量的功能应该还可以移植到别的库与项目中。
- 我之前使用的编辑工具为VSCode,在进行较多文件的编译时,用makefile进行编译,环境变量的设置可以使得今后TBB编程中makefile更容易写。
题外话,我想说,makefile 是最难的编程语言。。。