非标准路径安装OpenCV 2.4时G++编译找不到头文件怎么办
问题根因
当前报错属于编译阶段头文件查找失败,和链接库参数配置错误无关,编译流程还没走到链接动态库的步骤就已经中断。之前的操作存在两个核心错误:
- 混淆了
-I参数的作用:-I用于指定头文件搜索根目录,你之前将该参数指向存放动态库的$HOME/.local/lib路径,但OpenCV头文件默认不会存放在lib目录下,你从未给编译器指定头文件的正确搜索路径,自然会触发找不到.hpp文件的报错。 - 库名写法、参数顺序错误:OpenCV 2.4的动态库名模块间以下划线分隔,你之前写的
-lopencv、-lopencvcore均不符合命名规则;同时g++要求源文件写在链接参数之前,库链接参数放在源文件之后,顺序错误会触发链接阶段找不到符号的问题。
正确操作步骤
- 第一步:定位头文件实际存放路径
执行查找命令:find $HOME/.local -name "opencv.hpp"
若返回结果类似/home/你的用户名/.local/include/opencv2/opencv.hpp,则头文件搜索根目录为$HOME/.local/include,编译时需要添加-I$HOME/.local/include参数。
如果查找结果为空,说明你当初安装时只复制了动态库文件,没有同步放置头文件,只需重新解压OpenCV 2.4安装包,将包内include目录下的opencv、opencv2两个文件夹完整复制到$HOME/.local/include/路径下即可,无需root权限。 - 第二步:确认正确的动态库名
执行命令列出所有OpenCV相关动态库:ls $HOME/.local/lib/libopencv*
输出的文件名格式类似libopencv_core.so.2.4、libopencv_highgui.so.2.4、libopencv_imgproc.so.2.4,-l参数取文件名中lib前缀和.so后缀中间的部分即可,比如libopencv_core.so对应参数为-lopencv_core。 - 第三步:使用正确格式的编译命令
参考命令如下,按需增减你用到的模块对应的链接参数即可:g++ OpenCVTest.cpp -I$HOME/.local/include -L$HOME/.local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -o OpenCVTest - 第四步:配置运行时动态库路径
编译完成后直接运行程序会触发找不到动态库的报错,需要先执行命令添加动态库搜索路径:export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH
执行后再运行./OpenCVTest即可正常启动。如果需要永久生效,将上述export命令写入家目录下的.bashrc文件末尾即可。
内容的提问来源于stack exchange,提问作者Adam Rutledge
相关产品推荐
相关产品推荐

