Я только что изучил это и подумал, что некоторые другие могут быть заинтересованы в моих выводах.
Слабое связывание с weak_import действительно хорошо работает только с динамическими библиотеками. Вы можете заставить его работать со статической компоновкой (указав -undefined dynamic_lookup, как было предложено выше), но это не такая уж горячая идея. Это означает, что неопределенные символы не будут обнаружены до времени выполнения. Это то, чего я бы лично избегал в производственном коде.
Вот сеанс терминала Mac OS X, показывающий, как заставить его работать:
Вот ф.к.
int f(int n)
{
return n * 7;
}
Вот что.c
#include <stdio.h>
#include <stdlib.h>
extern int f (int) __attribute__((weak_import));
int main() {
if(f == NULL)
printf("what, no f?\n");
else
printf("f(8) is %d\n", f(8));
exit(0);
}
Сделать динамическую библиотеку из f.c:
$ cc -dynamiclib -o f.dylib f.c
Скомпилируйте и свяжите с динамической библиотекой, перечислите динамические библиотеки.
$ cc -o whatnof whatnof.c f.dylib
$ otool -L whatnof
whatnof:
f.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
Запустите whatnof, чтобы посмотреть, что произойдет:
$ whatnof
f(8) is 56
Теперь замените f.dylib пустой библиотекой (без символов):
$ mv f.dylib f.dylib.real
$ touch null.c
$ cc -dynamiclib -o f.dylib null.c
Запустите тот же whatnof, чтобы увидеть, что произойдет:
$ whatnof
what, no f?
Основная идея (или «вариант использования») для weak_import заключается в том, что он позволяет вам связываться с набором динамических (общих) библиотек, а затем запускать тот же код с более ранними версиями тех же библиотек. Вы можете проверить функции на NULL, чтобы узнать, поддерживаются ли они в конкретной динамической библиотеке, с которой в данный момент выполняется код. Кажется, это часть базовой модели разработки, поддерживаемой Xcode. Я надеюсь, что этот пример будет полезен; это помогло мне успокоиться об этой части дизайна Xcode.
person
Community
schedule
20.09.2010
int __attribute__((weak)) main() { ... }
у меня отлично работает с gcc/Mac OS X, но не компилируется с gcc/MinGW. :( - person mcandre   schedule 13.09.2012