我在尝试构建一些利用某些 opencv 库的代码时遇到链接器错误。错误本身是:
建筑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:找不到建筑x86_64符号
此错误的常见原因是什么?我的搜索发现,很多人在使用错误的库或在 i386 而不是 x86_64 中编译 opencv 时遇到了问题。我相当确定我没有这些问题中的任何一个。我通过带有标志的自制软件安装了opencv--c ++ 11(使用c ++ 11构建),我得到了
/usr/local/Cellar/opencv/2.4.11_1/lib/libopencv_core.dylib:Mach-O 64 位动态链接共享库x86_64
当我运行时:
file/usr/local/Cellar/opencv/2.4.11_1/lib/libopencv_core.dylib
任何帮助将不胜感激!如果还有其他我可以提供帮助的东西,请告诉我。
造成这种情况的常见原因是您尝试链接的动态库未安装或未符号链接到链接器搜索的目录中。
这可能是由两个问题引起的。
首先,当您尝试生成可执行文件时,可能会向链接器提供不完整的命令。 或者其次,您可能从自制软件中得到了错误的安装。
幸运的是,这很容易通过pkg-config
进行管理,如果您键入,您可以看到这是必需的
brew info opencv
这会产生
...
==> Dependencies
Build: cmake ✘, pkg-config ✔
Required: jpeg ✔, libpng ✘, libtiff ✔
...
通过注意到来自Homebrew的opencv bottle在其依赖项中使用pkg-config,您可以使用此工具为您获取链接器标志。
命令行构建的一个示例可能是
clang++ -std=c++11 -o opencv_app opencv_test.cpp $(pkg-config --cflags --libs opencv)
阅读页面man pkg-config
并在"说明"部分中查找以查看 .pc 文件的存储位置。 然后浏览到这些文件并测试 pkg-config
命令以获取包含和链接器路径。 一旦你有了这个工作,回到并尝试使用 $(pkg-config ...) 扩展插入的这些标志进行构建。
编辑 写完这篇文章后,我继续通过Homebrew安装opencv,以检查pkg-config
建议是否有效。 默认$PKG_CONFIG_PATH
不包括Homebrew存储*.pc文件的目录,因此您需要再做一件事。 类型 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
. 那你应该是能够像我一样毫无问题地运行pkg-config --cflags --libs opencv
。