簡體   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