dyld:找不到符号:__ZN2cv6imreadERKNSt3 在 MAC OS 10.10 上运行简单代码时

Posted

技术标签:

【中文标题】dyld:找不到符号:__ZN2cv6imreadERKNSt3 在 MAC OS 10.10 上运行简单代码时【英文标题】:dyld: Symbol not found: __ZN2cv6imreadERKNSt3 when run a simple code on MAC OS 10.10 【发布时间】:2014-11-07 13:14:08 【问题描述】:

我正在尝试在 MAC OS 10.10 上运行以下代码:

#include <cv.h>    
#include <highgui.h>    

using namespace std;
using namespace cv;

int main() 

    Mat img = imread("xxx.jpg");
    imshow("image", img);
    waitKey(0);

    return 0;

此代码可以成功构建。但是,当我运行它时,我总是收到错误消息:

dyld: lazy symbol binding failed: Symbol not found: 
__ZN2cv6imreadERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEi
Referenced from:    
/Users/Coldmoon/ComputerVisionApps/opencvTest/Build/Products/Debug/opencvTest
Expected in: /usr/local/lib/libopencv_highgui.2.4.dylib

我有两个不同版本的 opencv。一个是用libstdc++ 构建的,另一个是用libc++ 构建的。两者都是opencv 2.4.9。我想使用libc++ opencv 构建上述代码。

因此,在 Xcode 6.1 中,我将 Header Search PathLibrary Search Path 设置为指向位于 /Users/Coldmoon/MyLibraries/opencv-2.4.9 中的 libc++ opencv,并将 C++ Standard Library 设置为 libc++

我的问题:编译器似乎没有链接libc++ opencv,而是链接libstdc++ opencv,而是在/usr/local/lib

我完全糊涂了。有什么我想念的吗?

【问题讨论】:

如何告诉链接器使用哪个版本的opencv?我的意思是,你在/Users/Coldmoon/MyLibraries/opencv-2.4.9 中有两个库还是只有libc++ 一个?此外,libopencv_highgui.2.4.dylib 的安装路径可能等于/usr/local/lib/libopencv_highgui.2.4.dylib,因此在您链接到您家中的库后,链接的应用程序将在不同的文件夹中查找库。作为第一步,尝试使用DYLD_LIBRARY_PATH=/Users/Coldmoon/MyLibraries/opencv-2.4.9 运行您的应用程序。 非常感谢!成功了!我只是在 Xcode 的环境变量中设置了 DYLD_LIBRARY_PATH 值。让DYLD_LIBRARY_PATH=/Users/Coldmoon/MyLibraries/opencv-2.4.9/release/installed/lib。但是,我仍然不明白原因。在我看来,当我告诉 Xcode Header Search PathLibrary Search Path(指向 /Users/Coldmoon/MyLibraries/opencv-2.4.9/release/installed 中的 libc++ opencv)的位置时,信息已经足够清晰了! Xcode 应该知道要链接哪个库。为什么我需要告诉 Xcode DYLD_LIBRARY_PATH 的值? 顺便说一下,libstdc++ opencv 在 Xcode 最初倾向于链接的 /usr/local/lib 中。 Library Search Path 只告诉链接器从哪里获取库以将可执行文件链接到。但它不会告诉动态加载器在启动可执行文件时在哪里搜索库。您可以运行otool -L your_executable 来找出动态加载程序将在哪里寻找libopencv。然后运行otool -L &lt;path_to_libopencv_from_previous_otool_run&gt;,找出引用的libopencv使用了哪个标准库libstdc++libc++ 第一步,我运行了tool -L my_executable。它给了我lib/libopencv_imgproc.2.4.dylib (compatibility version 2.4.0, current version 2.4.9) 等等。但是,它是相对路径,而不是绝对路径。所以我不能做第二步。有什么办法可以得到绝对路径? 【参考方案1】:

Library Search Paths 告诉链接器在哪里搜索要链接的库。但是当可执行文件运行时,库可能会在不同的地方被动态加载器(dyld)搜索。这由otool -D libFoo.dylib 可能查询的库的“安装名称”控制。

因此,例如,如果您要链接的库位于/bar/libFoo.dylib,但其安装名称为/baz/libFoo.dylib,则您需要将/bar 放入Library Search Paths,但是当您运行二进制文件时将在/baz 中搜索。

您还可以在otool -L &lt;executable&gt; 运行可执行文件时找出这些库的搜索位置。

如果共享库的路径不是绝对路径,动态加载器会尝试从一些标准路径加载它。如果您设置DYLD_PRINT_LIBRARIES 环境变量,dyld 将记录它尝试加载到stderr 的库的文件名。您可以通过设置DYLD_LIBRARY_PATH 变量(:-分隔的路径列表)覆盖dyld 搜索库的路径。

有关dyld 环境变量的更多信息可以在man dyld 中找到。

【讨论】:

以上是关于dyld:找不到符号:__ZN2cv6imreadERKNSt3 在 MAC OS 10.10 上运行简单代码时的主要内容,如果未能解决你的问题,请参考以下文章

dyld:找不到符号:__TWPVs11AnyHashables20_AnyHashableProtocols

找不到dyld符号? _UIAccessibilityNotificationVoiceOverIdentifier

Xcode - dyld:找不到符号:__vtcOnSessionStart

dyld:找不到符号:__ZTISt9exception

dyld:惰性符号绑定失败:找不到符号:_objc_loadWeak

dyld:找不到符号:_OPENSSL_init_ssl