繁体   English   中英

编译器将忽略我的包含-I的新库版本

[英]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>> &params);
        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>> &params) = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM