[英]Handling “dyld: lazy symbol binding failed: Symbol not found” error when compiling C++ code on Mac
[英]dyld: Symbol not found: __ZN2cv6imreadERKNSt3 when run a simple code on MAC OS 10.10
我正在嘗試在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
為指向/Users/Coldmoon/MyLibraries/opencv-2.4.9
libc++
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_LIBRARY_PATH
變量( :
分隔的路徑列表)來覆蓋dyld
搜索庫的路徑。
有關dyld
環境變量的更多信息,請參見man dyld
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.