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相关接口的核心库,导致符号找不到。
解决方法
- 先修正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的最低编译依赖要求)即可。
- 补全依赖库:如果仍提示符号找不到,进入OpenVINO的库存放目录,执行
nm -D libopenvino.so | grep node_validation_failure_loc_string检查该符号是否存在于libopenvino.so中,如果不存在,在同目录下的其他so文件中搜索对应符号,将找到的对应库名添加到PLAT_LIBS配置中,常见需要补充的库有-lopenvino_core。
内容的提问来源于stack exchange,提问作者tremendous
相关产品推荐
相关产品推荐

