You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenVINO C++项目编译出现undefined reference链接错误求助

问题现象

编译C++项目链接OpenVINO时出现如下未定义引用错误:

hideqr.o:(.rodata+0x58): undefined reference to `ov::node_validation_failure_loc_string[abi:cx11](ov::Node const*)`

原项目使用的Makefile配置如下:

CPP_FLAGS='-std=c++11'
PLAT_HEADER_PATH = $(HIDEQR_INCLUDE) $(OPENVINO_HEADER_ROOT)/ie $(OPENVINO_HEADER_ROOT)/ngraph $(OPENVINO_HEADER_ROOT) \
                    $(RELY_ON_INCLUDE)

PLAT_LIB_PATH = $(OPENVINO_LIB_PATH) $(RELY_ON_LIB_PATH)

PLAT_LIBS:=-ltbb -ltbbmalloc -lopenvino


demo : demo.o hideqr.o
    g++ ${CPP_FLAGS} $^ $(PLAT_HEADER_PATH) $(PLAT_LIB_PATH) $(PLAT_LIBS) -o $@ 

demo.o : demo.cpp
    g++ ${CPP_FLAGS} -c $< -o $@

hideqr.o : hide_pic.cpp
    g++ ${CPP_FLAGS} -c $< $(PLAT_HEADER_PATH) $(PLAT_LIB_PATH) $(PLAT_LIBS)  -o $@
错误原因
  • Makefile参数格式错误:头文件搜索路径未添加-I前缀、库搜索路径未添加-L前缀,g无法识别传入的路径为搜索目录,实际编译、链接阶段根本没有加载配置的OpenVINO路径。另外在加-c参数的纯编译阶段(只生成目标文件,不做链接)传入-l、-L类链接参数完全无效,不会产生任何链接作用。原配置中CPP_FLAGS的参数值额外包裹了单引号,会导致g识别编译参数异常。
  • C++ ABI不匹配:错误信息中明确带有[abi:cxx11]标记,说明当前代码编译使用的C++ ABI版本和OpenVINO库编译时的ABI版本不一致。2021及更早版本的OpenVINO默认使用旧版C++ ABI(编译时定义_GLIBCXX_USE_CXX11_ABI=0),而当前使用-std=c++11参数编译时默认开启新版C++ ABI(_GLIBCXX_USE_CXX11_ABI=1),符号修饰规则不匹配就会出现未定义引用。
  • 链接依赖缺失:部分版本OpenVINO拆分了核心组件,仅链接-lopenvino会遗漏包含ov::Node相关接口的核心库,导致符号找不到。
解决方法
  1. 先修正Makefile基础参数错误,给所有头文件路径加-I前缀、库路径加-L前缀,移除纯编译阶段的无效链接参数,去掉CPP_FLAGS里多余的单引号,修正后的参考配置如下:
CPP_FLAGS = -std=c++11
PLAT_HEADER_PATH = -I$(HIDEQR_INCLUDE) -I$(OPENVINO_HEADER_ROOT)/ie -I$(OPENVINO_HEADER_ROOT)/ngraph -I$(OPENVINO_HEADER_ROOT) \
                    -I$(RELY_ON_INCLUDE)

PLAT_LIB_PATH = -L$(OPENVINO_LIB_PATH) -L$(RELY_ON_LIB_PATH)

PLAT_LIBS:=-ltbb -ltbbmalloc -lopenvino -lngraph


demo : demo.o hideqr.o
    g++ ${CPP_FLAGS} $^ $(PLAT_HEADER_PATH) $(PLAT_LIB_PATH) $(PLAT_LIBS) -o $@ 

demo.o : demo.cpp
    g++ ${CPP_FLAGS} -c $< $(PLAT_HEADER_PATH) -o $@

hideqr.o : hide_pic.cpp
    g++ ${CPP_FLAGS} -c $< $(PLAT_HEADER_PATH) -o $@

修改完成后先删除之前生成的.o文件和可执行文件,再重新执行make编译。
2. 对齐C++ ABI版本:如果修正参数后仍报相同错误,根据安装的OpenVINO版本调整ABI宏定义:

  • 若使用2021及更早版本OpenVINO,将CPP_FLAGS修改为CPP_FLAGS = -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0,强制使用旧版ABI编译代码,和库保持一致。
  • 若使用2022及之后版本OpenVINO,无需额外加ABI宏,确认系统GCC版本不低于7.5(该版本区间OpenVINO的最低编译依赖要求)即可。
  1. 补全依赖库:如果仍提示符号找不到,进入OpenVINO的库存放目录,执行nm -D libopenvino.so | grep node_validation_failure_loc_string检查该符号是否存在于libopenvino.so中,如果不存在,在同目录下的其他so文件中搜索对应符号,将找到的对应库名添加到PLAT_LIBS配置中,常见需要补充的库有-lopenvino_core。

内容的提问来源于stack exchange,提问作者tremendous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:33:01