本文讲述在Linux系统上运行依赖于IPP库的C项目过程
参考文档:
一、环境版本说明
测试环境:
- Unbuntu 11.2.0-19ubuntu1
- gcc 11.2.0
- cmake 3.22.1
- make 4.3-4.lbuild1
- ipp库 2021.7.0 Release Linux离线版
- apt 2.4.5(amd64)
- wget 1.21.2
二、配置操作系统环境
为了能够在LInux运行依赖了ipp库的程序,需要确保操作系统中安装有make(用于解释makefile中的指令)、gcc(C编译器)、cmake(帮助生成makefile文件)工具和wget(一款强大的下载文件工具) 这几个工具已经成为了各大Linux发行版本提供的工具,一般情况下无需手动安装。可以通过在命令行中输入以下命令查看工具的安装地址:
$which cmake make gcc wget# 查找组件安装地址
如果操作系统中没有cmake或者包含的版本过低,可以通过apt(Linux软件包管理工具)下载,在命令行中输入以下命令:
$sudo apt-get install cmake make gcc wget
三、下载Linux版本的IPP库
IPP库的下载可以通过下面两种方式
3.1 通过官方官网下载
IPP库可以直接去官网下载Linux离线版本,下载链接
https://www.intel.cn/content/www/cn/zh/developer/articles/tool/oneapi-standalone-components.html
3.2 通过wget下载
wget同样是Linux系统中的一个下载文件的工具,支持HTTP、HTTPS和FTP协议,常用于下载大型文件。
通过wget能够及其方便地帮助我们下载ipp离线库,输入以下命令,其中wget后面的参数是下载文件的网址,等待下载完成。
$wget https://registrationcenter-download.intel.com/akdlm/irc_nas/19126/l_ipp_oneapi_p_2021.7.0.25396_offline.sh
3.3 安装ipp库
下载完成后,就能得到一个.sh后缀的安装文件,其中wget默认将下载文件放在wget的当前执行目录里面,所以我们通过下面命令来运行sh脚本安装文件,假设文件名为l_ipp_oneapi_p_2021.7.0.25396_offline.sh:
sudo sh ./l_ipp_oneapi_p_2021.7.0.25396_offline.sh
./代表当前目录下,输入命令后就能开始安装ipp库了,选择默认的安装选项就行。
如果是选择的默认安装选项,下载完成后,应给能在目录**/opt/intel/oneapi/ipp**中找到ipp库的相关文件,这个地址很重要,后续链接ipp库的时候需要。
四、运行含有IPP库项目
4.1 创建工程目录
首先需要在/home/{用户名}/目录下创建一个文件夹用于存储我们的项目相关文件,创建的具体过程如下
$cd /home/{user}/ # 其中的{user}是用户名,应该换成操作系统中实际的用户名
$mkdir ippProject # 创建的存放项目的文件夹
$cd ippProject/ # 进入到创建的项目文件夹中
$mkdir build src # 再在项目文件中创建两个文件夹
$touch CMakeLists.txt # 在工程主目录中创建CMakeLists.txt文件
$touch ./src/CMakeLists.txt # 在src文件夹中也创建一个CMakeLists.txt文件
创建完成后,工程目录应该如下图所示,其中粗体代表文件夹,非粗体代表文件:
- ippProjet
- build
- CMakeLists.txt
- src
- CMakeLists.txt
这里简单说明以下各个文件:
- ippProjet:工程目录
- build:存储CMake运行时产生的MakeFile等文件
- CMakeLists.txt: 被CMake处理后生成相应的MakeFile文件,在工程主目录和src目录中都需要有
- src:用与存储源代码的文件(包括了.c,.h文件)
接下来,需要在src目录中放入源文件,即.c文件和.h头文件,其中一般包含有main.c文件作为主文件。
4.2 编写CMakeLists文件
首先进入到工程主目录中,即/home/{user}/ippProject/中,利用vim(Linux中自带的一个文件编辑器)来编写主工程目录中的CMakeLists.txt文件,输入以下命令:
$cd /home/boldfruit/ippProject/ # 进入工程主目录
$vim CMakeLists.txt # 编写CMakeLists.txt文件
输入vim的命令打开文件后,会进入到编辑界面,按“i”键进入插入模式,输入以下内容:
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.10)
# 设置项目工程名和版本号
project(InterferenceSignal VERSION 1.0)
# 添加src子目录
add_subdirectory(src)
# 打印信息
message(STATUS "root This is BINARY dir" ${PROJECT_BINARY_DIR})
message(STATUS "root This is SOURCE dir" ${PROJECT_SOURCE_DIR})
message(STATUS "cmake source dir" ${CMAKE_SOURCE_DIR})
# 设置编译器版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
编辑完成后,按下ESC进入设置模式,然后输入“:wq”保存并退回到终端。
之后我们还需要编辑src目录中的CMakeLists文件,输入
$vim /home/{user}/ippProject/src/CMakeLists.txt # 编辑src目录中的CMakeLists文件
CMakeLists文件中的内容如下:
# 指明ipp.h等头文件搜索路径,位置一般位于/opt/intel/oneapi/ipp/latest/include/中,需要根据具体情况而定
include_directories("/opt/intel/oneapi/ipp/latest/include" "/opt/intel/oneapi/ipp/latest/include/iw" "/opt/intel/oneapi/ipp/latest/include/iw++")
# 指定ipp相关静态库和动态库的搜索路径,位置一般位于/opt/intel/oneapi/ipp/latest/lib/intel64/中,需要根据具体情况而定
# 其中"/lib/x86_64-linux-gnu"为了解决ubuntu操作系统中math.h链接不到的问题
link_directories("/opt/intel/oneapi/ipp/latest/lib/intel64" "/opt/intel/oneapi/ipp/latest/lib/intel64/tl/openmp" "/opt/intel/oneapi/ipp/latest/lib/intel64/tl/tbb" "/opt/intel/oneapi/ipp/latest/lib/intel64/nonpic" "/lib/x86_64-linux-gnu")
# 指定用于生成可执行程序main的相关源文件(包含了.c和.h文件)
set(SRC_LIST main.c file1.c file1.h file2.c file2.h)
# 利用源文件(包括.c和.h文件)生成一个名为main的可执行文件
ADD_EXECUTABLE(main ${SRC_LIST})
# 指定生成可执行文件main所需要链接的库名,
TARGET_LINK_LIBRARIES(main -Wl,--start-group
"ippcore" "ippch" "ippcc" "ippcv" "ippdc" "ippe" "ippi" "ipp_iw" "ipps" "ippvm" "ippcc_tl_omp" "ippcore_tl_omp" "ippcv_tl_omp" "ippi_tl_omp" "ippcc_tl_tbb" "ippcore_tl_tbb" "ippcv_tl_tbb" "ippi_tl_tbb" "m"
-Wl,--end-group)
4.3 运行程序
进入到build目录中,这个目录用于存放CMake生成的Makefile等文件
$cd /home/{user}/ippProject/build/ # 进入到build文件夹中
$cmake ../ # ../代表上一级目录,即/ippProject/。cmake会运行/ippProject/CMakeLists.txt文件,生成相应的文件
执行完cmake命令之后,在build目录中应该会出现CMakeFiles、src、CMakeCache.txt、cmake_install.cmake、Makefile这五个文件,运行Makefile文件中的内容,接着进入到src目录中,就会发现一个名称为main的可执行程序,具体过程如下面代码所示:
$make # 执行build目录中的MakeFile文件的内容
$cd /home/{user}/ippProject/build/src/ # 进入到build/src目录中,此时会发现目录中已经生成了main的可执行文件
$./main # 执行main程序