OPENCV架构的未定义符号x86_64

OpenCV Undefined symbols for architecture x86_64

本文关键字:x86 符号 未定义 OPENCV      更新时间:2023-10-16

我已经使用此命令安装了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 ::分配器> const&amp; int)",从: _ main在ccw6dqpj.o ld中:符号(s)为架构x86_64 collect2:错误:ld返回1退出状态

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

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

给定评论中的答案,您有一个不兼容的stl。

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

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

我敢肯定,对于clang,您可以通过-stdlib=libc++来指示此版本的STL,我没有使用GCC尝试。