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

时间:2014-11-07 13:14:08

标签: c++ macos opencv shared-libraries dyld

我试图在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设置为{{ 1}}。

我的问题:似乎编译器没有链接libc++ opencv而是libc++ opencv而不是libstdc++

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

1 个答案:

答案 0 :(得分:2)

Library Search Paths告诉链接器在哪里搜索要链接的库。但是当运行可执行文件时,可以通过动态加载程序(dyld)在不同位置搜索库。这是由&#39;安装名称&#39;可以由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