NS3自定义模块调用OpenCV编译出现undefined reference报错如何解决
你遇到的链接错误是waf配置不符合规则,库搜索路径、依赖库的配置方式错误导致链接器没有找到你指定路径下的OpenCV库,以下是具体修正步骤:
- 错误1:混用链接参数到LINKFLAGS,没有遵循waf的变量规范
waf中头文件搜索路径、库文件搜索路径、依赖库名需要用不同的环境变量/构建属性分别配置,不能把-L、-l参数混写到LINKFLAGS中,正确的配置有两种方案:
方案1:在全局configure函数中配置(适合所有模块都要用到OpenCV的场景)
def configure(conf): # 配置OpenCV头文件搜索路径 conf.env.append_value("CXXFLAGS", ["-I/home/davide/opencv-4.5.4/include"]) # 配置OpenCV库文件搜索路径 conf.env.append_value("LIBPATH", ["/home/davide/opencv-4.5.4/build/lib"]) # 配置依赖的OpenCV库名,无需加-l前缀 conf.env.append_value("LIB", ["opencv_core", "opencv_ml"])
方案2:在模块build函数中单独给当前模块加配置(仅自定义模块用OpenCV的场景,更推荐,不影响其他模块)
def build(bld): # 替换为你自己的模块名和原有依赖 module = bld.create_ns3_module('你的自定义模块名', ['core', 'network']) # 新增OpenCV相关配置 module.includes += ['/home/davide/opencv-4.5.4/include'] module.libpath += ['/home/davide/opencv-4.5.4/build/lib'] module.lib += ['opencv_core', 'opencv_ml'] # 保留你原来的源文件等其他配置 module.source = [ 'model/module.cpp', # 其他源文件 ] # other stuff..
- 错误2:修改配置后未重新生成构建缓存
所有wscript配置修改完成后,必须执行以下命令重新配置并编译,否则waf会沿用旧的缓存配置:
./waf clean && ./waf configure && ./waf build
- 额外注意点
你代码中KNN初始化的拼写存在错误,OpenCV4中正确写法为cv::ml::KNearest::create()(K、N、首字母e均为大写),修复链接问题后编译会触发该拼写错误,可提前修改。
内容的提问来源于stack exchange,提问作者Davide Quaglio
相关产品推荐
相关产品推荐

