diff --git a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake index 56c422da4f..b3669931d3 100644 --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -1015,6 +1015,14 @@ if (onnxruntime_USE_QNN) ${QNN_LIB_FILES} $/onnxruntime/capi/ ) + if (EXISTS "${onnxruntime_QNN_HOME}/Qualcomm AI Hub Proprietary License.pdf") + add_custom_command( + TARGET onnxruntime_pybind11_state POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + "${onnxruntime_QNN_HOME}/Qualcomm AI Hub Proprietary License.pdf" + $/onnxruntime/ + ) + endif() endif() endif() diff --git a/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc b/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc index f322a27da2..67aabaec23 100644 --- a/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc +++ b/onnxruntime/core/providers/qnn/builder/qnn_backend_manager.cc @@ -1286,8 +1286,24 @@ void* QnnBackendManager::LoadLib(const char* file_name, int flags, std::string& return nullptr; } - // search from system lib path first - HMODULE mod = LoadLibraryExA(file_name, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); + HMODULE mod; + auto file_path = std::filesystem::path(file_name); + if (!file_path.is_absolute()) { + // construct an absolute path from ORT runtime path + file_name and check whether it exists. + auto pathstring = Env::Default().GetRuntimePath() + ToPathString(file_name); + auto absolute_path = pathstring.c_str(); + if (std::filesystem::exists(std::filesystem::path(absolute_path))) { + // load library from absolute path and search for dependencies there. + mod = LoadLibraryExW(absolute_path, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); + } else { + // use default dll search order for file_name. + mod = LoadLibraryExA(file_name, nullptr, 0); + } + } else { + // file_name represents an absolute path. + // load library from absolute path and search for dependencies there. + mod = LoadLibraryExA(file_name, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH); + } if (!mod) { error_msg = "load library failed"; return nullptr; diff --git a/setup.py b/setup.py index 7f597d15c6..a70c6211e3 100644 --- a/setup.py +++ b/setup.py @@ -332,6 +332,20 @@ else: libs.extend(["onnxruntime_providers_vitisai.dll"]) # DirectML Libs libs.extend(["DirectML.dll"]) + # QNN V68/V73 dependencies + qnn_deps = [ + "QnnCpu.dll", + "QnnHtp.dll", + "QnnSaver.dll", + "QnnSystem.dll", + "QnnHtpPrepare.dll", + "QnnHtpV73Stub.dll", + "libQnnHtpV73Skel.so", + "libqnnhtpv73.cat", + "QnnHtpV68Stub.dll", + "libQnnHtpV68Skel.so", + ] + libs.extend(qnn_deps) if nightly_build: libs.extend(["onnxruntime_pywrapper.dll"]) @@ -376,8 +390,8 @@ else: examples_names = ["mul_1.onnx", "logreg_iris.onnx", "sigmoid.onnx"] examples = [path.join("datasets", x) for x in examples_names] -# Extra files such as EULA and ThirdPartyNotices -extra = ["LICENSE", "ThirdPartyNotices.txt", "Privacy.md"] +# Extra files such as EULA and ThirdPartyNotices (and Qualcomm License, only for QNN release packages) +extra = ["LICENSE", "ThirdPartyNotices.txt", "Privacy.md", "Qualcomm AI Hub Proprietary License.pdf"] # Description readme_file = "docs/python/ReadMeOV.rst" if is_openvino else "docs/python/README.rst"