OSX下OpenCV报错:x86_64架构未定义符号cv::imwrite求助
我来帮你排查这个折腾人的问题!你已经尝试了重装和拷贝库,但还是找不到imwrite,咱们从几个常见的坑入手:
1. 先改编译命令的顺序!这是最容易踩的坑
你现在的编译命令把库参数放在了源文件前面,链接器是按顺序处理依赖的,正确的顺序应该是先指定源文件,再放链接库参数:
g++ BoxFilter.cc $(pkg-config --cflags --libs opencv) -o BoxFilter
之前的顺序会导致链接器处理库的时候还没看到你的代码里用到的imwrite,自然找不到符号。
2. 确认代码里的头文件和命名空间是否正确
imwrite在OpenCV 3.x之后属于imgcodecs模块,光包含opencv.hpp有时候可能不会自动引入这个模块的头文件,建议在代码里明确加上:
#include <opencv2/imgcodecs.hpp>
另外,如果你没写using namespace cv;,记得调用的时候要写cv::imwrite(...),不要直接写imwrite。
3. 检查pkg-config是否真的指向了你安装/拷贝的OpenCV
先执行这个命令看看pkg-config识别到的OpenCV信息:
pkg-config --list-all | grep opencv
如果输出里没有你装的3.3.0_3版本,或者路径不对,那说明你的PKG_CONFIG_PATH环境变量没设置对。比如你拷贝的朋友的OpenCV在/usr/local/Cellar/opencv/3.3.0_3,那需要把它的pkgconfig目录加入环境变量:
export PKG_CONFIG_PATH=/usr/local/Cellar/opencv/3.3.0_3/lib/pkgconfig:$PKG_CONFIG_PATH
执行完再重新运行编译命令试试。
4. 验证你的OpenCV库是否真的包含imwrite
用这个命令检查库文件里有没有imwrite的符号:
nm -D /usr/local/Cellar/opencv/3.3.0_3/lib/libopencv_imgcodecs.dylib | grep imwrite
如果没有输出,说明这个库本身就缺少imgcodecs模块,那不管怎么拷贝都没用。这种情况建议重新用brew安装完整的OpenCV,比如加上全功能参数:
brew reinstall opencv@3 --with-all-features
(注意brew里opencv3可能是opencv@3这个包名,而不是直接的opencv)
最后再试一次
按上面的步骤调整后,先清理之前的编译产物,再重新编译,应该能解决问题。如果还是不行,你可以把代码里调用imwrite的片段贴出来,我再帮你看细节。
内容的提问来源于stack exchange,提问作者baNv

