Windows下用CMake调用预编译ONNXRuntime库的链接错误解决
问题解决步骤
1. 统一编译平台(核心问题)
错误中明确提示library machine type 'x64' conflicts with target machine type 'x86',这是触发后续链接错误的根本原因:你的项目编译目标为x86架构,但ONNXRuntime库是x64架构,二者平台不匹配导致函数符号格式不一致(x86的stdcall函数名带@N后缀,x64无此修饰),进而出现LNK2019未解析符号错误。
解决方式:
- 命令行CMake配置:添加
-A x64参数指定x64平台:cmake -S . -B build -A x64 - CMake GUI配置:在点击"Configure"前,选择带x64后缀的生成器(例如
Visual Studio 17 2022 - x64)。 - CMakeLists.txt内强制指定:在
project指令前添加代码:if(WIN32) set(CMAKE_GENERATOR_PLATFORM x64) endif()
2. 修正CMake配置,规范链接ONNXRuntime
优化原CMake脚本,确保动态库符号正确导入,同时自动复制运行时依赖:
cmake_minimum_required(VERSION 3.13) # 先指定平台,再创建项目 if(WIN32) set(CMAKE_GENERATOR_PLATFORM x64) endif() project(myproject VERSION 0.1.0 LANGUAGES C CXX) add_executable(myproject main.cpp) set(ONNXRUNTIME_ROOTDIR ${CMAKE_SOURCE_DIR}/externals/onnxruntime) # 查找ONNXRuntime导入库 find_library(ONNXRUNTIME_LIB NAMES onnxruntime HINTS ${ONNXRUNTIME_ROOTDIR}/lib REQUIRED) # 包含头文件(使用target_include_directories更符合CMake规范) target_include_directories(myproject PRIVATE ${ONNXRUNTIME_ROOTDIR}/include) # 定义ORT_DLL宏,确保动态库符号正确导入 target_compile_definitions(myproject PRIVATE ORT_DLL) # 链接ONNXRuntime库 target_link_libraries(myproject PRIVATE ${ONNXRUNTIME_LIB}) # 自动复制ONNXRuntime的DLL到输出目录,避免运行时找不到依赖 add_custom_command(TARGET myproject POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${ONNXRUNTIME_ROOTDIR}/lib/onnxruntime.dll $<TARGET_FILE_DIR:myproject>)
3. 验证库架构匹配(可选)
如果不确定ONNXRuntime库的架构,可使用Visual Studio的dumpbin工具检查:
打开x64版本的Visual Studio命令提示符,执行:
dumpbin /headers C:\root\externals\onnxruntime\lib\onnxruntime.lib | findstr "machine"
若输出machine (x64),则确认库为x64架构,项目必须对应x64平台。
额外注意事项
- 确保下载的ONNXRuntime预编译库与你的Visual Studio版本兼容(例如VS2022需下载标注
vc17的库)。 - 如果使用静态版ONNXRuntime库,需将
ORT_DLL替换为ORT_STATIC宏,并链接所有附属依赖库,但你的场景为动态库(存在dll文件),无需此操作。
内容的提问来源于stack exchange,提问作者user51780
相关产品推荐
相关产品推荐

