Ubuntu 18,gcc-9 无法在标准库中为执行策略链接 tbb 库

如何解决Ubuntu 18,gcc-9 无法在标准库中为执行策略链接 tbb 库

我正在尝试使用 g++-9 编译 C++17 代码,该代码在 Ubuntu 18.04.5 LTS 中使用执行策略。我使用 GCC-9 手动构建并安装了 TBB 2020.2,因为认情况下它不适用于 Ubuntu 18。

当我调用使用带有参数 std::execution::seqstd::exectuion::unseq 的执行策略的函数时,一切正常。但是当我使用参数 std::execution::parstd::execution::par_unseq 调用相同的函数时,它无法链接 TBB。请注意,相同的代码在 Debian 10 中编译和运行没有任何问题。

我的 CMake 如下所示,它打印了我想要链接的正确版本的 TBB (2020.2)。

find_package(TBB required)
if (TBB_VERSION_MAJOR VERSION_LESS "2018")
    message(FATAL_ERROR "Require tbb 2018 or higher.")
endif()
message(STATUS "TBB: ${TBB_VERSION}")
...
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} PUBLIC ${TBB_IMPORTED_TARGETS})

编辑: 每 S.M.关于使用 MAKE_VERBOSE_MAKEFILE 评论的建议我发现没有链接到 TBB:

[ 75%] Linking CXX executable serialize
/usr/bin/cmake -E cmake_link_script CMakeFiles/serialize.dir/link.txt --verbose=1
/usr/bin/g++-9  -Wall -Wextra -Werror -fopenmp -ftree-vectorize -march=native -msse3 -O4 -DNDEBUG   CMakeFiles/serialize.dir/serialize.cpp.o  -o serialize 
CMakeFiles/serialize.dir/build.make:97: recipe for target 'serialize' Failed
make[2]: Leaving directory '/home/user/build-tresa'

我也再次在 CMake 中打印了 TBB_IMPORTED_TARGETS 变量,看起来它是空的。 在 target_link_libaries 中用 TBB 替换 TBB_IMPORTED_TARGETS 也没有帮助。 很奇怪,CMake 打印了 TBB 版本,但没有 TBB_IMPORTED_TARGETS 并且它没有将任何 tbb 共享对象链接到可执行文件

以下是编译器消息消息:

CMakeFiles/serialize.dir/serialize.cpp.o: In function `__pstl::__par_backend::__merge_task<std::pair<unsigned int,unsigned int>*,std::pair<unsigned int,__gnu_cxx::__normal_iterator<std::pair<unsigned int,std::vector<std::pair<unsigned int,unsigned int>,std::allocator<std::pair<unsigned int,unsigned int> > > >,read<unsigned int,unsigned int>(std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char> > const&)::{lambda(auto:1 const&,auto:2 const&)#1},__pstl::__par_backend::__serial_destroy,__pstl::__par_backend::__serial_move_merge<__pstl::__par_backend::__stable_sort_task<__gnu_cxx::__normal_iterator<std::pair<unsigned int,{lambda(auto:1 const&,__pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_policy const&,std::integral_constant<bool,false> >(__pstl::execution::v1::parallel_policy const&,false>,__pstl::execution::v1::parallel_policy const&<bool,true>,false>)::{lambda()#1}::operator()() const::{lambda(__gnu_cxx::__normal_iterator<std::pair<unsigned int,auto:2 const&)#1})#1}>::execute()::{lambda(std::pair<unsigned int,unsigned int> > > >)#1},{lambda()#1}::execute()::{lambda(std::pair<unsigned int,unsigned int> > > >)#2}> >::execute()':

...

CMakeFiles/tresa.dir/main.cpp.o: In function `std::vector<unsigned int,std::allocator<unsigned int> > nonzero<unsigned int,unsigned int>(std::vector<unsigned int,std::allocator<unsigned int> > const&,std::vector<unsigned int,std::allocator<unsigned int> >)':
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x153): undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x1d1): undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&,long)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x200): undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x297): undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&,long)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x2e8): undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&,long)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x2f9): undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x301): undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x43d): undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
main.cpp:(.text._Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE[_Z7nonzeroIjjESt6vectorIT_SaIS1_EERKS3_S0_IT0_SaIS6_EE]+0x491): undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
CMakeFiles/tresa.dir/main.cpp.o: In function `std::tuple<std::vector<long long,std::allocator<long long> >,std::allocator<unsigned int> > > mnge<unsigned int,std::allocator<unsigned int> > const&)':
main.cpp:(.text._Z12multi_arangeIjjESt5tupleIJSt6vectorIxSaIxEES1_IT_SaIS4_EEEERKS6_RKS1_IT0_SaISA_EE[_Z12multi_arangeIjjESt5tupleIJSt6vectorIxSaIxEES1_IT_SaIS4_EEEERKS6_RKS1_IT0_SaISA_EE]+0x220): undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&,long)'
main.cpp:(.text._Z12multi_arangeIjjESt5tupleIJSt6vectorIxSaIxEES1_IT_SaIS4_EEEERKS6_RKS1_IT0_SaISA_EE[_Z12multi_arangeIjjESt5tupleIJSt6vectorIxSaIxEES1_IT_SaIS4_EEEERKS6_RKS1_IT0_SaISA_EE]+0x41b): undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&,long)'
CMakeFiles/tresa.dir/main.cpp.o: In function `_ZN3tbb15parallel_invokeIZN6__pstl13__par_backend9__upsweepIllZZNS1_10__internal17__remove_elementsIRKNS1_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIPjSt6vectorIjSaIjEEEEZNS4_19__pattern_remove_ifISA_SH_Z7nonzeroIjjESE_IT_SaISK_EERKSM_SE_IT0_SaISP_EEEUlRjE_St17integral_constantIbLb0EEEESP_OSK_SP_SP_T1_T2_SU_IbLb1EEEUlPbS10_SH_E_SV_EESP_SW_SP_SP_SX_SY_ENKUlvE_clEvEUlllE1_St4plusIlEEEvSK_SK_SK_PSP_SK_SX_SY_EUlvE_ZNS3_IllS13_S15_EEvSK_SK_SK_S16_SK_SX_SY_EUlvE0_EEvRKSK_RKSP_RNS_18task_group_contextE':

...


CMakeFiles/tresa.dir/main.cpp.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIN9__gnu_cxx17__normal_iteratorIPSt4pairIjjESt6vectorIS5_SaIS5_EEEESA_S6_Z8readIjjE7graph_tIT_T0_ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEUlRKSD_RKSE_E_NS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskISA_S6_SS_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v115parallel_policyESA_SS_St17integral_constantIbLb0EEEEvOSD_SE_SE_T1_T2_S13_IbLb1EES18_ENKUlvE_clEvEUlSA_SA_SS_E_E7executeEvEUlSA_S6_E1_ZNS1B_7executeEvEUlSA_SA_S6_E2_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIN9__gnu_cxx17__normal_iteratorIPSt4pairIjjESt6vectorIS5_SaIS5_EEEESA_S6_Z8readIjjE7graph_tIT_T0_ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEUlRKSD_RKSE_E_NS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskISA_S6_SS_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v115parallel_policyESA_SS_St17integral_constantIbLb0EEEEvOSD_SE_SE_T1_T2_S13_IbLb1EES18_ENKUlvE_clEvEUlSA_SA_SS_E_E7executeEvEUlSA_S6_E1_ZNS1B_7executeEvEUlSA_SA_S6_E2_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'

...


CMakeFiles/tresa.dir/main.cpp.o:(.data.rel.ro._ZTIN3tbb10interface98internal9start_forINS_13blocked_rangeIPjEEN6__pstl13__par_backend19__parallel_for_bodyIS4_ZZNS6_10__internal17__remove_elementsIRKNS6_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIS4_St6vectorIjSaIjEEEEZNS9_19__pattern_remove_ifISF_SL_Z7nonzeroIjjESI_IT_SaISO_EERKSQ_SI_IT0_SaIST_EEEUlRjE_St17integral_constantIbLb0EEEEST_OSO_ST_ST_T1_T2_SY_IbLb1EEEUlPbS14_SL_E_SZ_EEST_S10_ST_ST_S11_S12_ENKUlvE_clEvEUlS4_S4_E4_EEKNS_16auto_partitionerEEE[_ZTIN3tbb10interface98internal9start_forINS_13blocked_rangeIPjEEN6__pstl13__par_backend19__parallel_for_bodyIS4_ZZNS6_10__internal17__remove_elementsIRKNS6_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIS4_St6vectorIjSaIjEEEEZNS9_19__pattern_remove_ifISF_SL_Z7nonzeroIjjESI_IT_SaISO_EERKSQ_SI_IT0_SaIST_EEEUlRjE_St17integral_constantIbLb0EEEEST_OSO_ST_ST_T1_T2_SY_IbLb1EEEUlPbS14_SL_E_SZ_EEST_S10_ST_ST_S11_S12_ENKUlvE_clEvEUlS4_S4_E4_EEKNS_16auto_partitionerEEE]+0x10): more undefined references to `typeinfo for tbb::task' follow
CMakeFiles/tresa.dir/main.cpp.o:(.data.rel.ro._ZTVN3tbb10interface98internal9flag_taskE[_ZTVN3tbb10interface98internal9flag_taskE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
CMakeFiles/tresa.dir/main.cpp.o:(.data.rel.ro._ZTVN3tbb8internal22parallel_invoke_helperE[_ZTVN3tbb8internal22parallel_invoke_helperE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
CMakeFiles/tresa.dir/main.cpp.o:(.data.rel.ro._ZTVN6__pstl13__par_backend18__stable_sort_taskIN9__gnu_cxx17__normal_iteratorIPSt4pairIjjESt6vectorIS5_SaIS5_EEEES6_Z8readIjjE7graph_tIT_T0_ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEUlRKSD_RKSE_E_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v115parallel_policyESA_SS_St17integral_constantIbLb0EEEEvOSD_SE_SE_T1_T2_S10_IbLb1EES15_ENKUlvE_clEvEUlSA_SA_SS_E_EE[_ZTVN6__pstl13__par_backend18__stable_sort_taskIN9__gnu_cxx17__normal_iteratorIPSt4pairIjjESt6vectorIS5_SaIS5_EEEES6_Z8readIjjE7graph_tIT_T0_ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEUlRKSD_RKSE_E_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v115parallel_policyESA_SS_St17integral_constantIbLb0EEEEvOSD_SE_SE_T1_T2_S10_IbLb1EES15_ENKUlvE_clEvEUlSA_SA_SS_E_EE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'

...


CMakeFiles/tresa.dir/main.cpp.o:(.data.rel.ro._ZTVN3tbb8internal9final_sumINS_13blocked_rangeIlEEN6__pstl13__par_backend17__trans_scan_bodyIlZZNS4_10__internal24__pattern_transform_scanIRKNS4_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIPKjSt6vectorIjSaIjEEEENSF_IPjSK_EENS7_7__no_opEjSt4plusIjESt17integral_constantIbLb1EESR_IbLb0EEEENSt9enable_ifIXntsrSt17is_floating_pointIT3_E5valueET1_E4typeEOT_T0_S13_SY_T2_SW_T4_T5_T6_SS_ENKUlvE_clEvEUllE_jSQ_ZZNS8_ISD_SL_SN_SO_jSQ_SS_ST_EES10_S12_S13_S13_SY_S14_SW_S15_S16_S17_SS_ENKS18_clEvEUllljE0_ZZNS8_ISD_SL_SN_SO_jSQ_SS_ST_EES10_S12_S13_S13_SY_S14_SW_S15_S16_S17_SS_ENKS18_clEvEUllljE1_EEEE[_ZTVN3tbb8internal9final_sumINS_13blocked_rangeIlEEN6__pstl13__par_backend17__trans_scan_bodyIlZZNS4_10__internal24__pattern_transform_scanIRKNS4_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIPKjSt6vectorIjSaIjEEEENSF_IPjSK_EENS7_7__no_opEjSt4plusIjESt17integral_constantIbLb1EESR_IbLb0EEEENSt9enable_ifIXntsrSt17is_floating_pointIT3_E5valueET1_E4typeEOT_T0_S13_SY_T2_SW_T4_T5_T6_SS_ENKUlvE_clEvEUllE_jSQ_ZZNS8_ISD_SL_SN_SO_jSQ_SS_ST_EES10_S12_S13_S13_SY_S14_SW_S15_S16_S17_SS_ENKS18_clEvEUllljE0_ZZNS8_ISD_SL_SN_SO_jSQ_SS_ST_EES10_S12_S13_S13_SY_S14_SW_S15_S16_S17_SS_ENKS18_clEvEUllljE1_EEEE]+0x28): more undefined references to `tbb::task::note_affinity(unsigned short)' follow
collect2: error: ld returned 1 exit status
CMakeFiles/tresa.dir/build.make:94: recipe for target 'tresa' Failed
make[2]: *** [tresa] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/tresa.dir/all' Failed
make[1]: *** [CMakeFiles/tresa.dir/all] Error 2
Makefile:83: recipe for target 'all' Failed
make: *** [all] Error 2

解决方法

我不依赖于您获得 FindTBB.cmake 的来源。 pkg-config 更可靠。

pkg_check_modules(TBB REQUIRED tbb>4.4) # Modify the version here

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} PUBLIC ${TBB_LIBRARIES})
,

由于找不到无法使用find_package链接tbb的原因,我只是手动链接了库。这样就可以工作了。

set(TBB_SHARED_OBJECT   "/usr/local/lib/libtbb.so")
add_library(TBBLIB SHARED IMPORTED)
set_target_properties(TBBLIB PROPERTIES
        IMPORTED_LOCATION "${TBB_SHARED_OBJECT}"
        INTERFACE_INCLUDE_DIRECTORIES "/usr/local/include")
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} PUBLIC TBBLIB)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?