2012-06-11 5 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 
    } 
} 

Однако он выходит из строя, даже если б не равны: -

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

Есть ли способ заставить приложение работать, по крайней мере, когда функции не вызываются? Или сделать загрузку только лениво?

Существует несколько таких функций, которые вызывают из нескольких dylib, поэтому проверка на каждую функцию будет последней, но даже это поможет.

+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, это похоже на путь. Когда доступны dylib, приложение прекрасно работает независимо от того, равно или нет. Есть ли вариант командной строки, который я могу сделать кодом, как опубликовано, работать. – Himanshu

+1

@ Химаншу, знаете ли вы, что на английском языке вопрос всегда заканчивается вопросительным знаком или «?»? – Griwes

+0

Вы можете попробовать слабую связь, но я не знаю, как вы проверили бы, правильно ли загружена библиотека. Я бы рекомендовал использовать 'dlopen' для загрузки динамической библиотеки, которая может быть недоступна. –

Смежные вопросы