https://github.com/microsoft/onnxruntime/releases
Releases · microsoft/onnxruntime
ONNX Runtime: cross-platform, high performance ML inferencing and training accelerator - microsoft/onnxruntime
github.com
→ 위 페이지에서 onnxruntime-win-x64-gpu-1.22.1.zip 해당 파일을 다운 받은 후 압축을 해제 해 준다.
- window 환경이면서 gpu를 사용하기 위해 onnxruntime-win-x64-gpu로 다운
- c++ 컴파일러 버전이 19.44.35216이고 cuda가 12.1라서 1.22.1 다운
→ 압축 해제 한 경로를 빌드 시 설정 해 줘야 한다.
생성한 프로젝트 폴더 내 CMakeLists.txt 파일에 아래와 같이 추가 해 주면 된다.
# ORT path
set(ONNXRUNTIME_ROOT "C:/hjyoo/practice/cpp_projects/onnxruntime-win-x64-gpu-1.22.1")
set(ONNXRUNTIME_INCLUDE "${ONNXRUNTIME_ROOT}/include")
set(ONNXRUNTIME_LIBDIR "${ONNXRUNTIME_ROOT}/lib")
target_include_directories(onnx_test PRIVATE "${ONNXRUNTIME_INCLUDE}")
# onnxruntime.dll
add_library(onnxruntime SHARED IMPORTED)
set_target_properties(onnxruntime PROPERTIES
IMPORTED_IMPLIB "${ONNXRUNTIME_LIBDIR}/onnxruntime.lib"
IMPORTED_LOCATION "${ONNXRUNTIME_LIBDIR}/onnxruntime.dll")
target_link_libraries(onnx_test PRIVATE onnxruntime)
# DLL copy
add_custom_command(TARGET onnx_test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${ONNXRUNTIME_LIBDIR}/onnxruntime.dll"
"${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_shared.dll"
"${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_cuda.dll"
"$<TARGET_FILE_DIR:onnx_test>/")
→ ORT 경로는 실제로 onnxruntime을 압축 해제 한 경로를 넣어주면 된다.
전체 CMakeLists.txt
project(onnx_test)
add_executable(onnx_test onnx_test.cpp)
# ORT path
set(ONNXRUNTIME_ROOT "C:/hjyoo/practice/cpp_projects/onnxruntime-win-x64-gpu-1.22.1")
set(ONNXRUNTIME_INCLUDE "${ONNXRUNTIME_ROOT}/include")
set(ONNXRUNTIME_LIBDIR "${ONNXRUNTIME_ROOT}/lib")
target_include_directories(onnx_test PRIVATE "${ONNXRUNTIME_INCLUDE}")
# onnxruntime.dll
add_library(onnxruntime SHARED IMPORTED)
set_target_properties(onnxruntime PROPERTIES
IMPORTED_IMPLIB "${ONNXRUNTIME_LIBDIR}/onnxruntime.lib"
IMPORTED_LOCATION "${ONNXRUNTIME_LIBDIR}/onnxruntime.dll")
target_link_libraries(onnx_test PRIVATE onnxruntime)
# DLL copy
add_custom_command(TARGET onnx_test POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${ONNXRUNTIME_LIBDIR}/onnxruntime.dll"
"${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_shared.dll"
"${ONNXRUNTIME_LIBDIR}/onnxruntime_providers_cuda.dll"
"$<TARGET_FILE_DIR:onnx_test>/")
onnx_test.cpp
#include <onnxruntime_cxx_api.h>
#include <iostream>
int main() {
try {
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "demo");
Ort::SessionOptions so;
// CUDA 먼저 시도 (device 0), 실패하면 CPU로 자동 내려가게 해봄
try {
OrtSessionOptionsAppendExecutionProvider_CUDA(so, /*device_id=*/0);
std::cout << "[INFO] CUDA EP enabled\n";
} catch (const Ort::Exception& e) {
std::cout << "[WARN] CUDA EP append failed, using CPU. msg=" << e.what() << "\n";
}
const wchar_t* model_path = L"C:/hjyoo/practice/cpp_projects/250827_1-stage_plate_face_S1_Cabin_Youtube_DMS_WIDER_Dataset_250827_v8S-p2_imgsz960_best.onnx"; // 같은 폴더에 간단한 ONNX 모델을 두면 테스트 쉬움
Ort::Session session(env, model_path, so);
Ort::AllocatorWithDefaultOptions alloc;
auto in0 = session.GetInputNameAllocated(0, alloc);
auto out0 = session.GetOutputNameAllocated(0, alloc);
std::wcout << L"Input0=" << in0.get() << L", Output0=" << out0.get() << std::endl;
// 실제 추론은 Ort::Value 텐서를 만들어 session.Run() 호출
// 여기서는 로딩/EP 동작 확인까지만.
std::cout << "Session created successfully.\n";
} catch (const Ort::Exception& e) {
std::cerr << "[ERR] ORT exception: " << e.what() << "\n";
return 1;
}
return 0;
}
빌드
cmake .. -G "Visual Studio 17 2022"
cmake --build ./
실행
.\Debug\onnx_text.exe
→ 만약 여기서 cudnn 에러가 발생한다면 환경 변수 설정이 제대로 안 된 것이다.
이는 CUDA랑 cudnn이 환경 변수로 설정이 안되어서 생긴 문제이기 대문에 환경 변수 설정에 가서 CUDA랑 cudnn 폴더 추가 해 줘야 한다.


사용자 변수에서 Path를 클릭 후 편집을 눌러 cudnn와 CUDA 경로를 새로 만들기로 추가 해 주면 된다.
이후 파워쉘 터미널에서 아래 명령어들로 제대로 path에 추가 됐는지 확인 가능하다.
where.exe cudnn64_9.dll
where.exe cudart64_12.dll
where.exe cublas64_12.dll
where.exe cublasLt64_12.dll
path에 추가한 경로대로 출력 된다면 제대로 추가 된 것이다.
이후 다시 위 cpp 파일을 실행하면 제대로 실행이 될 것이다.

그럼에도 불구하고 CUDA EP가 로드가 안된다면 터미널 내에서 영구적으로 아래와 같이 PATH에 CUDNN, CUDA 경로를 추가 해 주면 된다.
$cudnn = "C:/Program Files/NVIDIA/CUDNN/v9.11/bin/12.9"
$cuda = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.5/bin"
$user = [Environment]::GetEnvironmentVariable('Path','User')
$parts = $user -split ';'
if ($parts -notcontains $cudnn) { $user += ";$cudnn" }
if ($parts -notcontains $cuda) { $user += ";$cuda" }
[Environment]::SetEnvironmentVariable('Path', $user, 'User')
.vscode/launch.json에도 PATH를 추가해 준다.
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Cpp Debugger",
"type": "cppvsdbg",
"request": "launch",
"program": "${command:cmake.launchTargetPath}", // ← 선택된 CMake 타깃 exe 자동
"cwd": "${workspaceFolder}",
"args": [],
"stopAtEntry": false,
"environment": [
{
"PATH": "${env:PATH};C:/hjyoo/practice/cpp_projects/sdk/opencv/build/x64/vc16/bin;C:/Program Files/NVIDIA/CUDNN/v9.11/bin/12.9;C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.5/bin;"
}
],
"console": "integratedTerminal",
"preLaunchTask": "CMake: build" // CMake Tools 기본 빌드 태스크
}
]
}