2012-06-11 338 views
2

我寫一個C++的命令行工具爲Mac OS 10.5+用的XCode 3.2.5是這樣寫的: -延遲加載Dylibs

int main() 
{ 
    ... 
    if (a == b) 
    { 
     doWork() // defined in my.dylib 
     doOtherWork() // defined in his.dylib 
    } 
} 

但是它崩潰甚至當A和B是不相等的: -

Lab-Computer-9adf72:tmp labuser$ ./myapp 
dyld: Library not loaded: ./my.dylib 
    Referenced from: /private/tmp/./myapp 
    Reason: image not found 
Trace/BPT trap 

有沒有辦法讓應用程序至少在函數不被調用時工作?或者讓裝載只發生在懶惰?

有多個這樣的函數被多個dylibs調用,所以每個函數的檢查將是最後的手段,但即使這樣做也會有所幫助。

+4

所有的動態加載函數都有返回值,可以讓您判斷加載是否成功。 –

回答

3

我想你用dlopen動態加載庫。然後,您應該使用dlsym以名稱獲取符號(函數)的地址。所以你會這樣做:

void (*doWork)(); 
void (*doOtherWork)(); 

int main() { 
    doWork = dlsym(RTLD_DEFAULT, "doWork"); 
    doOtherWork = dlsym(RTLD_DEFAULT, "doOtherWork"); 
    if (a == b) { 
     if (doWork) doWork(); 
     if (doOtherwork) doOtherWork(); 
    } 
} 

您可以從這裏獲得更多的信息:Mac OS X ABI Dynamic Loader Reference

+0

很多很多謝謝你的回覆。雖然我不用dlopen加載它,但它看起來像是要走的路。當dylibs可用時,應用程序可以很好地工作,無論是否等於b。有沒有一個命令行選項,我可以使代碼,張貼,工作。 – Himanshu

+1

@Himanshu,你知道嗎,用英文,一個問題總是以問號或'?'結尾? – Griwes

+0

你可以嘗試弱鏈接,但我不知道如果庫已經正確加載,你將如何測試。我建議使用'dlopen'來加載可能不可用的動態庫。 –