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

标签 c++ opencv compiler-errors compilation include

我认为这个问题不是专门针对 OpenCV ,似乎更像是一个包含问题,所以即使您不了解该库,也请阅读它。

有一个旧版本的库 (OpenCV) 安装在 /usr/local 中。在我工作的远程机器上,我没有 sudo使用权。

我在本地环境中安装了更新版本 /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" .

新错误更新:

更改:#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 )

这是类(class) 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 中优先考虑新版本并解决了问题。

关于c++ - 编译器忽略我的包含 -I 新库版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856185/

相关文章:

c++ - 你认为是什么让这个 C++ 代码变慢了? (它循环遍历 ADODB 记录集,将 COM 类型转换为字符串,并填充 ostringstream)

c++ - 为什么我不能包含这个 .h?

OpenCV - 在背景减法器 MOG 中修复前景

python - 如何检测文本阴影

c# - 为什么实现具有相同属性的多个接口(interface)显示 'ambiguity' 警告?

c++ - 无窗口应用

c++ - boost::geometry::intersects 不适用于不同的几何类型?

opencv - OpenNI 和 OpenCV

c++ - 当我运行C++程序时,它返回某种数字

c++ - 调用 constexpr 函数的给定重载时触发编译时错误