【发布时间】: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。但是,我仍然不明白原因。在我看来,当我告诉 XcodeHeader Search Path和Library Search Path(指向/Users/Coldmoon/MyLibraries/opencv-2.4.9/release/installed中的 libc++ opencv)的位置时,信息已经足够清晰了! Xcode 应该知道要链接哪个库。为什么我需要告诉 XcodeDYLD_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)等等。但是,它是相对路径,而不是绝对路径。所以我不能做第二步。有什么办法可以得到绝对路径?
标签: c++ macos opencv shared-libraries dyld