C++调用CvMatToImageView报undefined reference错误如何解决
问题本质
这个报错属于链接阶段错误,不是代码语法错误:编译main.cpp时,编译器已经从morph.hpp读到了CvMatToImageView的声明,确认你的函数调用语法合法,但到链接环节,链接器找不到这个函数的实际实现二进制地址,就会抛出undefined reference错误。
你把函数实现直接写在main.cpp里就能正常编译运行,已经可以排除函数签名不匹配、依赖库缺失这类代码本身的问题,故障点在构建流程配置上。
具体原因和对应修复方法
- 最常见原因:morph.cpp没有被加入编译链接列表
如果你是手动敲g++/clang++命令编译,大概率是编译命令里只写了main.cpp,没带上morph.cpp,morph.cpp根本没被编译成目标文件,链接器当然找不到里面的函数实现。修复方式就是编译时把所有项目源文件都带上,示例命令:
如果你用Makefile、CMake这类构建工具,检查对应配置:比如CMake的g++ main.cpp morph.cpp -o demo `pkg-config --cflags --libs opencv4`add_executable参数里有没有列morph.cpp,Makefile的链接依赖里有没有包含morph.o目标文件。 - 次常见原因:morph.cpp里的函数实现实际没被编译
检查morph.cpp的代码,看CvMatToImageView的实现是不是被意外包在了自定义命名空间里,或者被#ifdef/#if这类条件编译宏包裹,导致编译morph.cpp时这段函数代码被跳过了。你可以单独编译morph.cpp生成目标文件,用符号查看命令确认函数有没有被编译进去:
如果命令执行后没有输出对应函数符号,就说明这段实现确实没被编译进目标文件,对应调整代码里的命名空间、条件编译逻辑即可。g++ -c morph.cpp `pkg-config --cflags opencv4` nm morph.o | grep CvMatToImageView - 极低概率原因:C/C混编符号修饰不匹配
如果你的构建规则把morph.cpp强制用C编译器编译,或者函数实现被extern "C"包裹,会出现C和C符号修饰规则不匹配的问题,但你的函数参数用到了cv::Mat这种C++类,这种情况基本不会出现,优先排查前两个问题即可。
内容的提问来源于stack exchange,提问作者Sudakov Andrey
相关产品推荐
相关产品推荐

