我试图在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
设置为指向libc++
中的/Users/Coldmoon/MyLibraries/opencv-2.4.9
opencv并将C++ Standard Library
设置为{{ 1}}。
我的问题:似乎编译器没有链接libc++
opencv而是libc++
opencv而不是libstdc++
。
我完全糊涂了。有什么我想念的吗?
答案 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
。