架构 x86_64 的未定义符号,OpenCV Yosemite 上的链接器问题

Undefined symbols for architecture x86_64, linker issues on Yosemite with OpenCV

我在尝试构建一些利用某些 opencv 库的代码时遇到链接器错误。 错误本身是:

Undefined symbols for architecture x86_64:

"cv::Exception::Exception(int, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, std::__cxx11::basic_string, std::allocator > const&, int)"

ld: symbol(s) not found for architecture x86_64

此错误的常见原因是什么? 我的搜索结果表明,很多人在使用错误的库或 i386 而不是 x86_64 编译 opencv 时遇到了问题。我相当确定我没有这些问题中的任何一个。我通过带有标志 --c++11 的自制软件安装了 opencv(使用 c++11 构建),我得到了

/usr/local/Cellar/opencv/2.4.11_1/lib/libopencv_core.dylib: Mach-O 64-bit dynamically linked shared library x86_64

当我 运行:

file /usr/local/Cellar/opencv/2.4.11_1/lib/libopencv_core.dylib

如有任何帮助,我们将不胜感激!如果我可以提供任何其他帮助,请告诉我。

通常的原因是您尝试link 反对的动态库未安装或未符号linked 到linker 搜索的目录中。

这可能是由两个问题引起的。

首先,当您尝试构建可执行文件时,您可能向 linker 提供了不完整的命令。或者其次,您可能从自制程序中安装了错误。

幸运的是,这很容易通过 pkg-config 管理,如果您输入,您会看到它是必需的 brew info opencv 这产生 ... ==> Dependencies Build: cmake ✘, pkg-config ✔ Required: jpeg ✔, libpng ✘, libtiff ✔ ... 通过注意到来自 Homebrew 的 opencv bottle 在其依赖项中使用 pkg-config,您可以使用此工具为您获取 linker 标志。

命令行构建的示例可能是

clang++ -std=c++11 -o opencv_app opencv_test.cpp $(pkg-config --cflags --libs opencv)

阅读页面 man pkg-config 并在 DESCRIPTION 部分中查找以查看 .pc 文件的存储位置。然后浏览到这些文件并测试 pkg-config 命令以获取包含和 linker 路径。一旦你完成了这项工作,请返回并尝试使用 $(pkg-config ...) 扩展插入的这些标志进行构建。

编辑 写完这篇 post 我继续通过 Homebrew 安装 opencv 以检查 pkg-config 建议是否有效。默认的 $PKG_CONFIG_PATH 不包括 Homebrew 存储 *.pc 文件的目录,因此您还需要做一件事。类型 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig。那你应该是 能够 运行 pkg-config --cflags --libs opencv 像我一样没有问题。