2012-06-11 357 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'来加载可能不可用的动态库。 –