【问题标题】:OpenCV symbols are undefined using gcc 5.1使用 gcc 5.1 未定义 OpenCV 符号
【发布时间】:2015-07-15 20:59:20
【问题描述】:

我有一个非常基本的程序来测试 OpenCV 是否有效。

#include <opencv2/opencv.hpp>

int main() {
    cv::namedWindow("Window", CV_WINDOW_AUTOSIZE);

    cv::VideoCapture video_capture;
    video_capture.open(0);

    while (true) {
        cv::Mat image;
        video_capture.read(image);

        cv::imshow("Window", image);

        if (cv::waitKey(1) == 27) {
            break;
        }
    }

    return 0;
}

还有一个像这样找到 OpenCV 的 CMakeLists.txt 文件:

find_package(OpenCV REQUIRED)
...
target_link_libraries(Project ${OpenCV_LIBS})

这适用于使用 OpenCV 2.4.10 和 clang 602.0.49 的 Mac OSX 10.10,但如果我尝试通过在 CMakeLists.txt 中输入 set(CMAKE_CXX_COMPILER /usr/gcc-5.1.0/bin/g++-5.1.0) 来使用 gcc 5.1,则会收到以下错误:

Undefined symbols for architecture x86_64:
  "cv::namedWindow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)", referenced from:
      _main in main.cpp.o
  "cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)", referenced from:
      _main in main.cpp.o

有什么问题,我该如何解决?

【问题讨论】:

  • 可能是new ABI
  • 不过我想使用 C++ 11。
  • 所以?您是否阅读过他们写的关于新 ABI 的内容以及如何解决包括std::__cxx11:: 在内的符号链接失败的问题?
  • @DanielFrey 所以我只需要使用 gcc 5.1 重新编译 opencv?
  • 没有。只需在包含任何其他标题之前添加#define _GLIBCXX_USE_CXX11_ABI 0

标签: c++ macos opencv gcc


【解决方案1】:

请使用您用于编译上述代码的相同版本的 gcc 重新编译您的 OpenCV。这个问题应该有望消失。来自官方 gcc 页面,

如果您收到有关未定义符号引用的链接器错误,这些符号涉及 std::__cxx11 命名空间或标签 [abi:cxx11] 中的类型,则可能表明您正在尝试将使用不同值编译的目标文件链接在一起对于 _GLIBCXX_USE_CXX11_ABI 宏。当链接到使用旧版本 GCC 编译的第三方库时,通常会发生这种情况。如果第三方库不能用新的 ABI 重建,那么你需要用旧的 ABI 重新编译你的代码。

【讨论】:

  • 对于 6 之前的 gcc 版本,这可以通过调用 cmake 并将 CXXFLAGS 设置为 "-std=c++11" 或 "-std=c++14" 来完成:CXXFLAGS="-std=c++11" cmake ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2012-05-05
相关资源
最近更新 更多