我正在尝试在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
设置为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
。