《Cmake构建实战》4 onnxruntime的查找模块实践
本帖最后由 maskmoo 于 2024-11-3 18:21 编辑<p><span style="font-size:20px;"><strong>1 onnxruntime模块配置</strong></span></p>
<p>onnxruntime是微软开发的一个机器学习推理和训练的加速库。onnxruntime本身并没有提供用于导入依赖的Cmake配置文件,因此需要自行实现一个用于查找onnxruntime的查找模块Findonnxruntime.cmake。查找模块主要完成对onnxruntime库的头文件/库文件的路径和库版本号等参数的查找。</p>
<p>首先下载onnxruntime预编译包,<a href="https://github.com/microsoft/onnxruntime/releases">Releases · microsoft/onnxruntime (github.com)</a>,我这里选择的是onnxruntime-win-x64-1.20.0版本。</p>
<p> </p>
<p>解压文件,可以发现库文件夹中主要包含头文件include目录和库文件lib两个文件夹组成.</p>
<p> </p>
<p>查找脚本编写,查找脚本将环境变量onnxruntime_ROOT作为候选路径,通过find_path find_library以及find_file命令分别查找头文件和库文件的路径以及库版本信息。</p>
<p>最用采用FindPackageHandleStandardArgs模块来进行检查。</p>
<pre>
<code class="language-cpp">find_path(onnxruntime_INCLUDE_DIR onnxruntim e_c_api.h
HINTS ENV onnxruntime_ROOT
PATH_SUFFIXES include)
find_library(onnxruntime_LIBRARY
NAMES onnxruntime
HINTS ENV onnxruntime_ROOT
PATH_SUFFIXES lib)
find_file(onnxruntime_VERSION_FILE VERSION_NUMBER
HINTS ENV onnxruntime_ROOT)
if(onnxruntime_VERSION_FILE)
file(STRINGS ${onnxruntime_VERSION_FILE} onnxruntime_VERSION LIMIT_COUNT 1)
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(onnxruntime
REQUIRED_VARS onnxruntime_LIBRARY onnxruntime_INCLUDE_DIR
VERSION_VAR onnxruntime_VERSION
)
if(onnxruntime_FOUND)
set(onnxruntime_INCLUDE_DIRS ${onnxruntime_INCLUDE_DIR})
set(onnxruntime_LIBRARIES ${onnxruntime_LIBRARY})
add_library(onnxruntime::onnxruntime SHARED IMPORTED)
target_include_directories(onnxruntime::onnxruntime INTERFACE ${onnxruntime_INCLUDE_DIRS})
if(WIN32)
set_target_properties(onnxruntime::onnxruntime PROPERTIES
IMPORTED_IMPLIB "${onnxruntime_LIBRARY}")
else()
set_target_properties(onnxruntime::onnxruntime PROPERTIES
IMPORTED_LOCATION "${onnxruntime_LIBRARY}")
endif()
endif()</code></pre>
<p><span style="font-size:20px;"><strong>2 在目录程序CmakeList.txt文件中引用配置</strong></span></p>
<p>首先向set(CMAKE_MODULE_PATH 插入当前目录,方便寻找当前文件夹下的脚本文件。以及设置onnxruntime_ROOT目录;最终通过find_package命令真正开始查找onnxruntime库。</p>
<pre>
<code>cmake_minimum_required(VERSION 3.20)
project(find-onnxruntime)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR};${CMAKE_MODULE_PATH}")
set(CMAKE_CXX_STANDARD 11) # 设置C++标准为11
set(onnx_version 1.20.0) # 根据下载的版本进行设置,本例使用1.10.0版本
# 请下载onnxruntime库的压缩包,并解压至该目录中
if("$ENV{ }" STREQUAL "")
if(WIN32)
set(ENV{onnxruntime_ROOT} "${CMAKE_CURRENT_LIST_DIR}/onnxruntime-win-x64-${onnx_version}")
elseif(APPLE)
set(ENV{onnxruntime_ROOT} "${CMAKE_CURRENT_LIST_DIR}/onnxruntime-osx-universal2-${onnx_version}")
else()
set(ENV{onnxruntime_ROOT} "${CMAKE_CURRENT_LIST_DIR}/onnxruntime-linux-x64-${onnx_version}")
endif()
endif()
find_package(onnxruntime 1.20) # 指定依赖的最小版本
add_executable(main main.cpp)
target_link_libraries(main onnxruntime::onnxruntime)
target_compile_definitions(main PRIVATE ORT_NO_EXCEPTIONS)</code></pre>
<p>添加主程序引用onnxruntime库中的函数,用来测试证明onnxruntime库已经被成功链接到主程序中了。</p>
<p> </p>
<pre>
<code class="language-cpp">#include <onnxruntime_cxx_api.h>
int main() {
Ort::Env env;
Ort::Session session(env, ORT_TSTR(""), Ort::SessionOptions(nullptr));
return 0;
}</code></pre>
<p><span style="font-size:20px;">3 配置测试</span></p>
<p>执行配置命令行,可以发现已经可以查找到onnxruntime库。 </p>
<pre>
<code>mkdir build
cd build
cmake ..</code></pre>
<p> </p>
<p>执行cmake --build . 命令进行编译,编译完成后将onnxruntime.dll拷贝到Findonnxruntime\build\Debug下执行main.exe,执行结果输出了一条错误信息,表明onnxruntime库已经被成功链接到主程序中了。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
页:
[1]