Esta pregunta se ha hecho antes, pero al buscar en la documentación de las diversas herramientas de desarrollo, parece que es posible, simplemente no es obvio.Cómo crear una biblioteca estática para iOS sin hacer que todos los símbolos sean públicos
Motivo: Creación de una biblioteca estática para que otros desarrolladores de iOS la utilicen. Algunos símbolos en la biblioteca causarán problemas si se exportan, por lo que deseo convertirlos en símbolos solo internos. Con una biblioteca dinámica, esto es fácil, solo use el argumento -exported_symbols_list
libtool
(ld
) y enumere los que desea que sean públicos. La documentación libtool
no permitirá este argumento para bibliotecas estáticas.
La biblioteca tiene varios archivos ObjectiveC .m que usan código entre sí. Solo se debe hacer pública una clase del grupo a los usuarios del último archivo de biblioteca estática .a.
Probado libtool -exported_symbols_list publicsymbols.exp
pero el argumento libtool
no es compatible con -static
para bibliotecas estáticas.
No se pueden hacer los símbolos privados con atributos (si eso funciona) porque los necesitan los otros archivos .m del grupo.
parece ld
puede tardar varios archivos .o y unirlos en un nuevo archivo .o (mediante el argumento -r
) y que no tiene el descargo de responsabilidad "dinámica única" para el argumento -exported_symbols_list
(que podría ser sólo documentación confusa ...).
simplemente como una prueba que construir mi proyecto con Xcode por lo que han hecho todos los archivos .o, y luego tratar de llamar ld
en la línea de comandos, así:
ld -r -x -all_load -static -arch armv6 -syslibroot {path}
-filelist /Users/Dad/ABCsdk/iphone-ABClib/build/ABCLib.build/Distribution-iphoneos/ABCLib-device.build/Objects-normal/armv6/ABCsdk.LinkFileList
-exported_symbols_list {exp file path} -o outputfile.o
donde el {ruta} tipo cosas tienen largos caminos a los lugares apropiados allí.
pero tengo errores como el siguiente:
/usr/bin/ld_classic: /Users/Dad/ABCsdk/iphone-ABClib/build/ABCLib.build/Distribution-iphoneos/ABCLib-device. construir/objetos normales/ARMv6/ABCmain.o incompatibles, archivo contiene tipo no compatible de la sección 3 (_ TEXTO, _picsymbolstub4) en el comando de carga 0 (debe especificar "-dynamic" para ser utilizado)
por lo algo parece estar mal allí ...
¿Alguien sabe una manera inteligente de hacer que esto funcione? Gracias.
¿Qué tipo de símbolos necesitas ocultar? – Macmade
Símbolos que pueden entrar en conflicto si tienen la misma sub biblioteca ya vinculada a su aplicación (JSONkit dice). Puedo, obviamente, incluir los archivos JSONKit y decirles que los incluyan también si aún no están en su proyecto, pero esperaba que se agregara un archivo .h y .a al proyecto para una integración más limpia. . – Dad