Acabo de analizar esto y pensé que otros podrían estar interesados en mis hallazgos.
La vinculación débil con weak_import realmente solo funciona bien con bibliotecas dinámicas. Puede hacer que funcione con enlaces estáticos (al especificar "dynamic_lookup no definido" como se sugirió anteriormente), pero esta no es una idea tan buena. Significa que no se detectarán símbolos indefinidos hasta el tiempo de ejecución. Esto es algo que evitaría en el código de producción, personalmente.
Aquí está una sesión de Terminal de Mac OS X que muestra cómo hacer que funcione:
Aquí está fc
int f(int n)
{
return n * 7;
}
Aquí es whatnof.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);
}
hacer una biblioteca dinámica desde fc:
$ cc -dynamiclib -o f.dylib f.c
Compilar y vincular con la lib dinámica, enumerar las librerías dinámicas.
$ 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)
Run whatnof para ver lo que sucede:
$ whatnof
f(8) is 56
Ahora reemplace f.dylib con una biblioteca vacía (no símbolos):
$ mv f.dylib f.dylib.real
$ touch null.c
$ cc -dynamiclib -o f.dylib null.c
Run misma whatnof para ver lo que sucede:
$ whatnof
what, no f?
La idea básica (o "caso de uso") para weak_import es que le permite enlazar contra un conjunto de bibliotecas dinámicas (compartidas), pero luego ejecute el mismo código en versiones anteriores de las mismas bibliotecas. Puede verificar las funciones contra NULL para ver si son compatibles con la biblioteca dinámica particular con la que se está ejecutando actualmente el código. Esto parece ser parte del modelo de desarrollo básico soportado por Xcode. Espero que este ejemplo sea útil; me ayudó a tranquilizarme sobre esta parte del diseño de Xcode.
'int __attribute __ ((weak)) main() {...}' funciona bien para mí con gcc/Mac OS X, pero no se puede compilar con gcc/MinGW. :( – mcandre
este puede ser el problema: http://stackoverflow.com/questions/13089166/how-to-make-gcc-link-strong-symbol-in-static-library-to-overwittren-sweak-symbol –