use*_*291 5 c++ linker tbb cmake ld
我已经tbb下载并放置在我的存储库目录中:
> tree deps/tbb/ -d \ndeps/tbb/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmake\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 serial\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tbb\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tbb\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compat\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 internal\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 machine\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ia32\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 gcc4.8\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 intel64\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 gcc4.8\nRun Code Online (Sandbox Code Playgroud)\n在我的CMakeLists.txt我已经尝试过这个:
include_directories("deps/tbb/include")\n\n\nfind_library(TBB_LIB\n NAMES\n tbbbind_debug\n tbbbind\n tbb_debug\n tbbmalloc_debug\n tbbmalloc_proxy_debug\n tbbmalloc_proxy\n tbbmalloc\n tbb_preview_debug\n tbb_preview\n tbb\n HINTS "${CMAKE_PREFIX_PATH}/deps/tbb/lib/intel64/gcc4.8"\n)\n\nadd_executable(${PROJECT_NAME}\nsrc/main.cpp\n)\n\ntarget_link_libraries(${PROJECT_NAME} PUBLIC ${TBB_LIB})\nRun Code Online (Sandbox Code Playgroud)\n但是使用cmake, 链接器构建会引发此错误:
\n\n/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld:找不到-lTBB_LIB-NOTFOUND
\ncollect2:错误:ld 返回 1 退出状态
\n
我无法弄清楚缺少什么。谢谢。
\n此提交解决了之前的错误:
\n- HINTS "${CMAKE_PREFIX_PATH}/deps/tbb/lib/intel64/gcc4.8"\n+ HINTS "deps/tbb/lib/intel64/gcc4.8"\nRun Code Online (Sandbox Code Playgroud)\n但是,抛出了新的错误:
\n\n\n对“tbb::interface7::internal::task_arena_base::internal_current_slot()\”的未定义引用
\n
除了 之外find_library,还有哪些 CMake 工具可用于链接到 TBB 共享库?
我尝试过一些 CMake 工具,但我无法弄清楚如何*.so正确链接到 TBB 文件!
Ale*_*ing 14
TBB 具有原生 CMake 支持。在我安装了 Intel oneAPI 的系统上,配置包安装在此处:
/opt/intel/oneapi/tbb/latest/lib/cmake/tbb/TBBConfig.cmake
Run Code Online (Sandbox Code Playgroud)
因此,我只需要添加/opt/intel/oneapi/tbb/latest到我的CMAKE_PREFIX_PATH. 在我的 CMakeLists.txt 中,我写道:
cmake_minimum_required(VERSION 3.21)
project(test-tbb)
find_package(TBB REQUIRED)
add_library(main main.cpp)
target_link_libraries(main PRIVATE TBB::tbb)
target_compile_features(main PRIVATE cxx_std_11)
Run Code Online (Sandbox Code Playgroud)
TBB 提供了 IMPORTED 目标TBB::tbb,这是您应该链接到的目标。
main.cpp 只是这里的来源:/sf/answers/2574795611/
像这样构建:
$ cmake -G Ninja -S . -B build -DCMAKE_PREFIX_PATH=/opt/intel/oneapi/tbb/latest
$ cmake --build build --verbose
[1/2] /usr/bin/c++ -isystem /opt/intel/oneapi/tbb/2021.3.0/include -MD -MT CMakeFiles/main.dir/main.cpp.o -MF CMakeFiles/main.dir/main.cpp.o.d -o CMakeFiles/main.dir/main.cpp.o -c /home/alex/test2/main.cpp
[2/2] : && /usr/bin/cmake -E rm -f libmain.a && /usr/bin/ar qc libmain.a CMakeFiles/main.dir/main.cpp.o && /usr/bin/ranlib libmain.a && :
Run Code Online (Sandbox Code Playgroud)
受到 @AlexReinking 答案的启发,这是最终的实现:
project(my-cpp-service VERSION 0.1.0)
# Equivalent to command-line option of `-DCMAKE_PREFIX_PATH=...`
list(APPEND CMAKE_MODULE_PATH "deps/tbb/cmake/")
find_package(TBB REQUIRED)
add_executable(${PROJECT_NAME}
src/main.cpp
)
target_link_libraries(${PROJECT_NAME} PUBLIC
TBB::tbb
)
Run Code Online (Sandbox Code Playgroud)