[英]Compiler ignores my includes -I for new library version
我认为这个问题不是专门针对OpenCV ,它似乎是一个包含问题,因此即使您不知道该库也请阅读它。
有一个旧版本的库(OpenCV)安装在我正在工作且没有sudo
访问权限的远程计算机上的/usr/local
。
我已经在本地环境/home/spm1428/local
安装了更新版本,并且正在使用-I/home/spm1428/local/include/opencv
和-I/home/spm1428/local/include/opencv2
。
但是,在#include "opencv/opencv.hpp"
文件中,出现此错误:
In file included from /usr/local/include/opencv2/opencv.hpp:77:0,
from /home/spm1428/CloudCache/Utilities/Utility.hpp:11,
from ../Descriptors/Descriptor.cpp:17:
/usr/local/include/opencv2/highgui/highgui.hpp:165:25: error: redeclaration of ‘IMREAD_UNCHANGED’
这是/usr/local
安装的库的旧版本给出的错误,但是我告诉他使用-I
使用本地版本!
因此,似乎编译器会忽略我的-I
指令,而是将优先级赋予/usr/local/include
为什么会这样?
如果您想知道整个编译命令是:
g++ -DCC_DISABLE_CUDA -I/home/spm1428/CloudCache -I/home/spm1428/local/include/opencv -I/home/spm1428/local/include/opencv2 -I/usr/include/boost -I/home/spm1428/vlfeat -O3 -g -Wall -c -fopenmp -std=c++11 -c -o Descriptor.o ../Descriptors/Descriptor.cpp
使用#include <opencv2/core.hpp>
并include "opencv2/core.hpp"
#include <opencv2/core.hpp>
发生此错误。
更新新错误:
更改: #incldue <opencv2/opencv.hpp>
更改为#include "opencv2/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
由于某种原因解决了该问题。 但是,现在我编译时:
g++ -DCC_DISABLE_CUDA -I/home/spm1428/local/include -I/home/spm1428/CloudCache -I/home/spm1428/local/include/opencv -I/home/spm1428/local/include/opencv2 -I/usr/include/boost -I/home/spm1428/vlfeat -O3 -g -Wall -c -fopenmp -std=c++11 -c -o SIFTOpenCV.o ../Descriptors/SIFTOpenCV.cpp
我收到此错误:
../Descriptors/SIFTOpenCV.cpp:31:9: error: ‘class cv::Feature2D’ has no member named ‘detectAndCompute’
sift->detectAndCompute(img, cv::Mat(), pts, descriptors);
SIFTOpenCV.cpp
包含SIFTOpenCV.hpp
,其中包含#include "opencv2/xfeatures2d.hpp"
。 我认为此错误与上一个错误有关。
最奇怪的是,这在我的本地计算机(我具有sudo
访问权限,并且我将其安装在/usr/local
)上正确编译了
这是类SIFTOpenCV.hpp
:
#include "Descriptors/Descriptor.hpp"
#include <opencv2/xfeatures2d.hpp>
namespace cc{
class SIFTOpenCV : public Descriptor{
public:
SIFTOpenCV(int nFeatures=0, int nOctaveLayers=3, double contrastThreshold=0.04, double edgeThreshold=10, double sigma=1.6);
void mapParams(std::vector<std::pair<std::string,std::string>> ¶ms);
void ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors);
private:
cv::Ptr<cv::xfeatures2d::SIFT> sift;
int nFeatures, nOctaveLayers;
double contrastThreshold, edgeThreshold, sigma;
};
}
而Descriptor.hpp
:
#include "opencv2/core.hpp"
#include <string>
#include <map>
namespace cc{
class Descriptor{
public:
virtual void mapParams(std::vector<std::pair<std::string,std::string>> ¶ms) = 0;
virtual void ComputeDescriptors(cv::Mat &img, cv::Mat1f &descriptors) = 0;
virtual void ComputeDescriptors(const std::string &fileName, const std::string &imgExt, cv::Mat1f &descriptor);
virtual void ComputeDescriptors(const std::string &dirPath, const std::string &imgExt, std::vector<cv::Mat1f> &descriptors);
void setResizeDim(const size_t resizeDim);
void setSamples (const size_t samples);
void setOMP(const bool omp);
virtual ~Descriptor();
private:
void ComputeDescriptorsRange(const std::vector<std::string> &files, std::vector<cv::Mat1f> &descriptors, const int start, const int finish, size_t errors);
size_t resizeDim = 0; //comput full-size image
int samples = 0;
bool omp = true;
};
}
我自己找到了解决方案:执行cpp -v
返回了我:
/usr/local/include
/usr/include
/home/spm1428/local/include
...
这意味着使用-I/home/spm1428/local/include
被忽略,因为它已包含在内,但/usr/local/include
的旧版本已被赋予优先级。
在新的本地目录中安装OpenCV并将其包含在-I
,将新版本的优先级赋予优先级并解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.