我试图使用TBB和lambda表达式编写一个基本的C++程序,但无法编译它。
#include <iostream>
#include <cstdlib>
#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>
using namespace std;
using namespace tbb;
void Foo(int number) {
cout<<number<<endl;
}
void ParallelApplyFoo(int* a, size_t n) {
parallel_for(blocked_range<size_t > (0, n),
[ = ](const blocked_range<size_t>& r){
for (size_t i = r.begin(); i != r.end(); ++i)
Foo(a[i]);
}
);
}
int main(int argc, char** argv) {
int num = 10;
int* a = new int[num];
for(int i = 0; i < num; i++)
a[i] = i;
ParallelApplyFoo(a,num);
return 0;
}
和编译器消息:
main.cpp:在函数“void ParallelApplyFoo(int *,size_t)”中:
main.cpp:25:9:警告:Lambda表达式仅在-std = c++ 11或-std = gnu ++ 11中可用[默认启用]
main.cpp:26:5:错误:没有匹配函数可调用‘parallel_for(tbb::blocked_range,ParallelApplyFoo(int *,size_t)::&)>)”
main.cpp:26:5:注意:候选人为:
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:161:6:注意:模板无效tbb::parallel_for(const Range&,const Body&)
main.cpp:26:5:错误:“模板无效tbb::parallel_for(const Range&,const Body&)”的模板参数使用本地类型“ParallelApplyFoo(int *,size_t)::&)>”
main.cpp:26:5:错误:尝试实例化“模板无效tbb::parallel_for(const Range&,const Body&)”
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:168:6:注意:模板无效tbb::parallel_for(const Range&,const Body&,const tbb::simple_partitioner&)
/usr/include/tbb/parallel_for.h:168:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要3个参数,其中2个
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:175:6:注意:模板无效tbb::parallel_for(const Range&,const Body&,const tbb::auto_partitioner&)
/usr/include/tbb/parallel_for.h:175:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要3个参数,其中2个
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:182:6:注意:模板无效tbb::parallel_for(const Range&,const Body&,tbb::affinity_partitioner&)
/usr/include/tbb/parallel_for.h:182:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要3个参数,其中2个
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:190:6:注意:模板无效tbb::parallel_for(const Range&,const Body&,const tbb::simple_partitioner&,tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:190:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要4个参数,其中2个
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:197:6:注意:模板无效tbb::parallel_for(const Range&,const Body&,const tbb::auto_partitioner&,tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:197:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要4个参数,其中2个
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:204:6:注意:模板无效tbb::parallel_for(const Range&,const Body&,tbb::affinity_partitioner&,tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:204:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:候选人需要4个参数,其中2个
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:248:6:注意:模板无效tbb::strict_ppl::parallel_for(Index,Index,const Function&,tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:248:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推导了参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int *,size_t)::&)>”)
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:235:6:注意:模板无效tbb::strict_ppl::parallel_for(Index,Index,Index,const Function&,tbb::task_group_context&)
/usr/include/tbb/parallel_for.h:235:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推导了参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int *,size_t)::&)>”)
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:228:6:注意:模板无效tbb::strict_ppl::parallel_for(Index,Index,const Function&)
/usr/include/tbb/parallel_for.h:228:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推导了参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int *,size_t)::&)>”)
在main.cpp:10:0中包含的文件中:
/usr/include/tbb/parallel_for.h:215:6:注意:模板无效tbb::strict_ppl::parallel_for(Index,Index,Index,const Function&)
/usr/include/tbb/parallel_for.h:215:6:注意:模板参数推导/替换失败:
main.cpp:26:5:注意:推导了参数“索引”的冲突类型(“tbb::blocked_range”和“ParallelApplyFoo(int *,size_t)::&)>”)
gmake [2]:*** [build / Release / GNU-Linux-x86 / main.o]错误1
我尝试了编译器标志“-std = c++ 11”和“-std = gnu ++ 11”,然后输出:
g++ -std = gnu ++ 11 -o dist / Release / GNU-Linux-x86 / test build / Release / GNU-Linux-x86 / main.o
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::start_for,ParallelApplyFoo(int *,unsigned int):: {lambda(tbb::blocked_range const&)#1} ,tbb::auto_partitioner>::〜start_for()':
main.cpp :(。text + 0x6):对tbb::task的vtable的 undefined reference
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::start_for,ParallelApplyFoo(int *,unsigned int):: {lambda(tbb::blocked_range const&)#1} ,tbb::auto_partitioner>::〜start_for()':
main.cpp :(。text + 0x26):对tbb::task的vtable的 undefined reference
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::start_for,ParallelApplyFoo(int *,unsigned int):: {lambda(tbb::blocked_range const&)#1} ,tbb::auto_partitioner>::run(tbb::blocked_range const&,{lambda(tbb::blocked_range const&)#1} const&,ParallelApplyFoo(int *,unsigned int):: {lambda(tbb::blocked_range const&)# 1} const&)':
main.cpp :(。text + 0x9d):对`tbb::task_group_context::init()的 undefined reference
main.cpp :(。text + 0xb5):对`tbb::internal::allocate_root_with_context_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0xe1):对`tbb::internal::get_initial_auto_partitioner_divisor()'的 undefined reference
main.cpp :(。text + 0x107):对`tbb::task_group_context::~~ task_group_context()的 undefined reference
main.cpp :(。text + 0x116):对`tbb::task_group_context::~~ task_group_context()的 undefined reference
main.cpp :(。text + 0x12a):对tbb::task的vtable的 undefined reference
main.cpp :(。text + 0x138):对`tbb::internal::allocate_root_with_context_proxy::free(tbb::task&)const的 undefined reference
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::start_for,ParallelApplyFoo(int *,unsigned int):: {lambda(tbb::blocked_range const&)#1} ,tbb::auto_partitioner>::execute()':
main.cpp :(。text + 0x251):对`tbb::internal::allocate_continuation_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0x27b):对`tbb::internal::allocate_child_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0x313):对`tbb::internal::allocate_continuation_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0x33d):对`tbb::internal::allocate_child_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0x4b6):对`tbb::internal::allocate_continuation_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0x4e8):对`tbb::internal::allocate_child_proxy::allocate(unsigned int)const的 undefined reference
main.cpp :(。text + 0x585):对`tbb::task_group_context::is_group_execution_cancelled()const的 undefined reference
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::flag_task::〜flag_task()'中:
main.cpp :(。text._ZN3tbb10interface68internal9flag_taskD2Ev [_ZN3tbb10interface68internal9flag_taskD5Ev] + 0x6):未定义对vtable的tbb::task引用
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::signal_task::〜signal_task()'中:
main.cpp :(。text._ZN3tbb10interface68internal11signal_taskD2Ev [_ZN3tbb10interface68internal11signal_taskD5Ev] + 0x6): undefined reference “vtable for tbb::task”
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::signal_task::〜signal_task()'中:
main.cpp :(。text._ZN3tbb10interface68internal11signal_taskD0Ev [_ZN3tbb10interface68internal11signal_taskD0Ev] + 0x6): undefined reference 'vtable for tbb::task'
build / Release / GNU-Linux-x86 / main.o:在函数`tbb::interface6::internal::flag_task::〜flag_task()'中:
main.cpp :(。text._ZN3tbb10interface68internal9flag_taskD0Ev [_ZN3tbb10interface68internal9flag_taskD0Ev] + 0x6):未定义对tbb::task的vtable的引用
build / Release / GNU-Linux-x86 / main.o :(。rodata + 0x20):对tbb::task的typeinfo的 undefined reference
build / Release / GNU-Linux-x86 / main.o :(。rodata._ZTVN3tbb10interface68internal11signal_taskE [_ZTVN3tbb10interface68internal11signal_taskE] + 0x14):未定义对`tbb::task::note_affinity(unsigned short)'的引用
build / Release / GNU-Linux-x86 / main.o :(。rodata._ZTVN3tbb10interface68internal9flag_taskE [_ZTVN3tbb10interface68internal9flag_taskE] + 0x14):未定义对`tbb::task::note_affinity(unsigned short)'的引用
build / Release / GNU-Linux-x86 / main.o :(。rodata._ZTIN3tbb10interface68internal11signal_taskE [_ZTIN3tbb10interface68internal11signal_taskE] + 0x8): undefined reference “typeinfo for tbb::task”
build / Release / GNU-Linux-x86 / main.o :(。rodata._ZTIN3tbb10interface68internal9flag_taskE [_ZTIN3tbb10interface68internal9flag_taskE] + 0x8): undefined reference “针对tbb::task的typeinfo”
我正在使用Fedora 18(当然会安装tbb和tbb-devel软件包)。
任何人有什么想法吗?代码从这里复制:http://software.intel.com/en-us/blogs/2009/08/03/parallel_for-is-easier-with-lambdas-intel-threading-building-blocks
最佳答案
使用-ltbb编译器标志(位于http://goparallel.sourceforge.net/compiling-tbb-programs-and-examples-on-linux-ubuntu/)解决了它。无论如何,谢谢大家的帮助:)
关于c++ - 无法使用TBB和Lambda编译基本的C++程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15467710/