无法在Linux上使用GCC运行C++17并行算法

3
我希望使用GCC9.3来运行C++17中的执行策略,使用std算法。
我已经下载了https://github.com/oneapi-src/oneTBB/releases/download/v2021.1.1/oneapi-tbb-2021.1.1-lin.tgz,但是我遇到了一个错误,即“task”类未定义,甚至在https://www.ibm.com/developerworks/aix/library/au-intelthreadbuilding/index.html的“hello world”示例中也出现了这个问题。
#include "tbb/tbb.h"
#include <iostream>
using namespace tbb;
using namespace std;
 
class first_task : public task { 
    public: 
    task* execute( ) { 
       cout << "Hello World!\n";
       return NULL;
    }
};
 
int main( )
{ 
    task_scheduler_init init(task_scheduler_init::automatic);
    first_task& f1 = *new(tbb::task::allocate_root()) first_task( );
    tbb::task::spawn_root_and_wait(f1);
}

我得到以下错误:
test.cpp:55:32: error: expected class-name before '{' token
   55 | class first_task : public task {
      |                                ^
test.cpp:57:5: error: 'task' does not name a type
   57 |     task* execute( ) {
      |     ^~~~
test.cpp: In function 'int main()':
test.cpp:65:5: error: 'task_scheduler_init' was not declared in this scope
   65 |     task_scheduler_init init(task_scheduler_init::automatic);
      |     ^~~~~~~~~~~~~~~~~~~
test.cpp:66:38: error: 'allocate_root' is not a member of 'tbb::v1::task'
   66 |     first_task& f1 = *new(tbb::task::allocate_root()) first_task( );
      |                                      ^~~~~~~~~~~~~
test.cpp:67:16: error: 'spawn_root_and_wait' is not a member of 'tbb::v1::task'
   67 |     tbb::task::spawn_root_and_wait(f1);
      |                ^~~~~~~~~~~~~~~~~~~

我正在编译:使用以下命令: g++ -I<path_to_tbb>/oneapi-tbb-2021.1.1/include/oneapi -I<path_to_tbb>/oneapi-tbb-2021.1.1/include/oneapi/tbb -I<path_to_tbb>/oneapi-tbb-2021.1.1/include -L<path_to_tbb>/oneapi-tbb-2021.1.1/lib/intel64/gcc4.8/ test.cpp -o test 从<path_to_tbb>运行source env/var.h没有帮助,我做错了什么吗?
谢谢。

1
不确定这里发生了什么,而且似乎与此无关,但是对我来说gcc4.8看起来非常错误,因为GCC >= 5中的libstdc++在设计上具有ABI不兼容性,以符合C++11标准,除非它专门配置为向后兼容。 - FrankHB
1
您需要将应用程序与TBB链接,即在命令行中添加“-ltbb”,例如:https://solarianprogrammer.com/2019/05/09/cpp-17-stl-parallel-algorithms-gcc-intel-tbb-linux-macos/ 但是,您也遇到了编译器错误。尝试使用选项“-E”执行预处理器步骤并查看生成的文件。此外,错误消息中的行号与您向我们展示的源不对应。 - zkoza
如果您使用的是Linux,请检查您的发行版是否带有tbb软件包,例如在基于Debian的发行版上,可能可以使用apt install libtbb-dev命令。然后使用g++ test.cpp -o test $(pkg-config --libs --cflags tbb)进行编译。 - G. Sliepen
你好, 感谢您的评论。 @S.M. - 即使使用更短的命令,我仍然遇到同样的问题。 - Igor
@G.Sliepen 我在使用CentOS,但是没有安装软件包的权限。这是共享的系统,不是我自己的。 - Igor
显示剩余3条评论
1个回答

1
从错误信息中我得出结论,你使用的gcc或TBB实现是一种实验性的。正如你所看到的,gcc确实找到了TBB(在#include tbb/tbb.h上没有错误),这很好!然后,错误显示你使用的某些函数被隐藏在tbb::v1命名空间内。因此,你可以使用using namespace tbb::v1或在所有“未知”名称前面添加tbb::v1::
然后,在https://community.intel.com/t5/Intel-oneAPI-Threading-Building/Unable-to-compile-TBB-program/td-p/1226663中,他们说tbb::task已经过时。请使用更现代的TBB教程 :-)
另请参见:https://github.com/oneapi-src/oneTBB/issues/243

非常感谢。您在评论中提供的示例确实可以编译。但是原始的“tasks”错误来自于GCC执行策略头文件,而不是我直接使用“task”。我应该使用旧版本的TBB与GCC吗?哪个版本适用于GCC 9.3? - Igor
你不应该使用旧的例子!就这样,我想。如今,在受信任公司的网页上使用旧的例子非常普遍,因为行业变化很快。其中一个例子是cmake,它有很多面向初学者的教程,但我找到的没有一个教授“现代cmake”。错误来自gcc,这是可能的,但其起源绝对在TBB中。最有可能的是,所有被弃用的内容都被移动到tbb::v1命名空间中。简单地不要使用这些功能,因为它们很快将从TBB中删除。 - zkoza
我没有使用那些特性。我添加了<execution> include。GCC中的代码显然使用了Task。我没有找到GCC/TBB兼容矩阵。 - Igor
你向我们展示的代码明确地使用了任务。下次只展示你感兴趣的代码即可。此外,当gcc 9.3发布时,TBB任务可能尚未过时。请参阅:https://software.intel.com/content/www/us/en/develop/articles/tbb-revamp.html以及其中的pdf文件。我在上一个项目中广泛使用了TBB,但我们有一个人专门处理所有这些兼容性问题并编写包装器来解决它们。 - zkoza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接