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 Path
和 Library 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 Path
和 Library 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 <path_to_libopencv_from_previous_otool_run>
,找出引用的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 <executable>
运行可执行文件时找出这些库的搜索位置。
如果共享库的路径不是绝对路径,动态加载器会尝试从一些标准路径加载它。如果您设置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