我正在尝试在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设置为指向libc++中的/Users/Coldmoon/MyLibraries/opencv-2.4.9 opencv,并将C++ Standard Library设置为libc++

我的问题:似乎编译器没有链接libc++ opencv,而是链接了libstdc++ opencv,它位于/usr/local/lib中。

我很困惑。我有什么想念的吗?

最佳答案

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变量(DYLD_LIBRARY_PATH分隔的路径列表)来覆盖:搜索库的路径。

有关dyld环境变量的更多信息,请参见man dyld

07-27 19:38