OpenCV架构x86_64

时间:2018-12-18 12:05:07

标签: c++ opencv linker linker-errors

我已经使用此命令安装了OpenCV 4.0.0

brew install hybridgroup/tools/opencv

我正在尝试编译一个简单程序,该程序将文件系统中的图像加载到cv::Mat中。

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

int main() {
    auto img = cv::imread("/Users/peter/Dektop/source.png");
    return 0;
}

而且我不断收到此错误

  

x86_64体系结构的未定义符号:
  “ cv :: imread(std :: __ cxx11 :: basic_string,   std :: allocator> const&,int)“,引用自:   ccw6DQpj.o中的_main ld:找不到体系结构x86_64 collect2的符号:错误:ld返回1退出状态

我正在使用此命令进行编译。 GCC 8.2.0。

g++-8 main.cpp -std=c++17 `pkg-config --cflags --libs opencv4`

1 个答案:

答案 0 :(得分:1)

鉴于评论中的答案,您拥有STL的二进制不兼容版本。

OpenCV4使用libc ++构建,该库将string的符号定义为std::v1::basic_string,而libstdc ++(GCC的默认值)使用std::__cxx11::basic_string

在编译时,您不知道这两种用法之间的区别,因为您使用的是同一接口。但是,实现是不同的。 在调用时,需要一个这样的字符串的函数,您将需要使用相同版本的STL进行编译。

我确定对于Clang,您可以传递-stdlib=libc++来指示此版本的STL,但我尚未在GCC中尝试过。