编译生成tbb动态库并用cmake链接

2024-03-27 21:20

本文主要是介绍编译生成tbb动态库并用cmake链接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文关于基于github源码编译tbb生成动态库,并在cmake中使用

步骤一: 编译tbb并生成shared library

在github下载项目源码

git clone git@github.com:oneapi-src/oneTBB.gitcd oneTBBmkdir build && cd build

开始编译

参考:

Alex Reinking

cmake -G Ninja -S . -B build-shared -DBUILD_SHARED_LIBS=YES -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS=-DTBB_ALLOCATOR_TRAITS_BROKENcmake --build build-sharedcmake --install build-shared --prefix _install

执行完成后,在build文件夹里可以看到新生成的文件夹

 动态库生成。

步骤二:通过cmakelists建立链接

项目如上图结构组织,具体内容如下 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.9)
project (hello_tbb)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++11 -fpermissive -Wall -Werror -O2 -Wno-deprecated -Wno-deprecated-declarations")add_executable(hello_tbb main.cpp)
#target_include_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/opencv-3.4.3/16.04/include)#target_link_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/opencv-3.4.3/16.04/lib)
target_include_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/tbb_lib/include)
target_link_directories(hello_tbb PUBLIC ${CMAKE_HOME_DIRECTORY}/third_party/tbb_lib/lib)#set(OpenCV_LIBS
#    opencv_ml opencv_highgui opencv_imgproc opencv_calib3d
#    opencv_features2d opencv_imgcodecs opencv_videoio opencv_video
#    opencv_aruco opencv_ccalib opencv_hdf opencv_core)target_link_libraries(hello_tbb tbb)#target_link_libraries(hello_tbb PUBLIC ${OpenCV_LIBS})

main.cpp

 

#include <iostream>
#include <random>
#include <chrono>
#include <cmath>
#include <tbb/tbb.h>inline double calculate_objective_value(double x)
{return std::sin(x);
}inline double calculate_derivative_value(double x)
{return std::cos(x);
}int main()
{std::random_device seed;std::default_random_engine engine(seed());std::uniform_real_distribution<double> uniform_dist(0.0, 10.0);constexpr int num_elements   = 1000000;std::vector<double> x_optimal(num_elements);auto perform_gradient_descent = [&](int i){constexpr double epsilon = 1e-15;constexpr double rate    = 0.99;double a = 0.50;double x = uniform_dist(engine);while (true){const double delta = a * calculate_derivative_value(x);x -= delta;a *= rate;if (delta < epsilon) { break; }}x_optimal[i] = x;};const auto t_0 = std::chrono::system_clock::now();tbb::parallel_for(0, num_elements, perform_gradient_descent);const auto t_1 = std::chrono::system_clock::now();for (int i = 0; i < num_elements; ++ i) { perform_gradient_descent(i); }const auto t_2 = std::chrono::system_clock::now();const int elapsed_time_parallel = std::chrono::duration_cast<std::chrono::milliseconds>(t_1 - t_0).count();const int elapsed_time_serial   = std::chrono::duration_cast<std::chrono::milliseconds>(t_2 - t_1).count();std::cout << "parallel: " << elapsed_time_parallel << " [ms]" << std::endl;std::cout << "serial:   " << elapsed_time_serial   << " [ms]" << std::endl;return 0;

使用cmakelists编译成功后,运行OK

利用ldd检查一下可执行文件的链接关系,tbb链接位置正确,符合预期

 

 

这篇关于编译生成tbb动态库并用cmake链接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853420

相关文章

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

idea-java序列化serialversionUID自动生成方式

《idea-java序列化serialversionUID自动生成方式》Java的Serializable接口用于实现对象的序列化和反序列化,通过将对象转换为字节流来存储或传输,实现Serializa... 目录简介实现序列化serialVersionUID配置使用总结简介Java.io.Seripyth

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Java编译错误java.lang.NoSuchFieldError的解决方案详析

《Java编译错误java.lang.NoSuchFieldError的解决方案详析》java.lang.NoSuchFieldError是Java中的一种运行时错误,:本文主要介绍Java编译错... 目录前言解决方案1. 统一JDK版本环境2. 优化maven-compiler-plugin配置3. 清

C#自动化生成PowerPoint(PPT)演示文稿

《C#自动化生成PowerPoint(PPT)演示文稿》在当今快节奏的商业环境中,演示文稿是信息传递和沟通的关键工具,下面我们就深入探讨如何利用C#和Spire.Presentationfor.NET... 目录环境准备与Spire.Presentation安装核心操作:添加与编辑幻灯片元素添加幻灯片文本操

基于Nacos实现SpringBoot动态定时任务调度

《基于Nacos实现SpringBoot动态定时任务调度》本文主要介绍了在SpringBoot项目中使用SpringScheduling实现定时任务,并通过Nacos动态配置Cron表达式实现任务的动... 目录背景实现动态变更定时机制配置化 cron 表达式Spring schedule 调度规则追踪定时

GO语言中gox交叉编译的实现

《GO语言中gox交叉编译的实现》本文主要介绍了GO语言中gox交叉编译的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、安装二、使用三、遇到的问题1、开启CGO2、修改环境变量最近在工作中使用GO语言进行编码开发,因