我正在尝试在 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++
opencv,它位于 /Users/Coldmoon/MyLibraries/opencv-2.4.9
并将 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
中找到.
关于c++ - dyld:找不到符号:__ZN2cv6imreadERKNSt3 在 MAC OS 10.10 上运行简单代码时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26802086/