架构 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
像我一样没有问题。
我在尝试构建一些利用某些 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
像我一样没有问题。