[英]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.