¿Por qué Xcode 7 muestra * .tbd en lugar de * .dylib?

138

Xcode 7 en Target> BuildPhases> Enlace binario con bibliotecas> toque + botón

Al elegir marcos para agregar, no puede encontrar * .dylib, verá * .tbd en su lugar.

¿Cuál es la razón para esto?

** Para las personas que necesitan dylib, sigue esta publicación

  1. Elija "Agregar otro"
  2. Una vez en la ventana de selección de archivos, haga "CMD" + Shift + G (Ir a la carpeta) y escriba / usr / lib /
  3. Desde / user / lib puede encontrar los archivos * .dylib
Ted
fuente
11
Todo es parte del "plan secreto" de Apple ...
l'L'l
agregar * .dylib desde / usr / lib / Esto solo funciona para mí cuando ejecuto mi aplicación en el simulador, no funciona con el dispositivo.
keshav vishwkarma

Respuestas:

153

He buscado en Google, pero lo único que puedo encontrar hasta ahora es la siguiente cita de los foros de desarrolladores de Apple :

Para aquellos que tienen curiosidad, los archivos .tbd son nuevas "bibliotecas de código auxiliar basadas en texto", que proporcionan una versión mucho más compacta de las bibliotecas de código auxiliar para usar en el SDK y ayudan a reducir significativamente el tamaño de descarga.

Esperemos que pronto llegue más documentación.

Actualizar

Como ejemplo, aquí está todo el contenido de libsqlite3.tbd . Es solo un archivo de texto. Tenga en cuenta que el nombre de instalación es libsqlite3.dylib .

---
archs:           [ armv7, armv7s, arm64 ]
platform:        ios
install-name:    /usr/lib/libsqlite3.dylib
current-version: 216.4
compatibility-version: 9.0
exports:         
  - archs:           [ armv7, armv7s, arm64 ]
    symbols:         [ __sqlite3_lockstate, __sqlite3_purgeEligiblePagerCacheMemory, 
                       __sqlite3_system_busy_handler, __sqlite_auto_profile, 
                       __sqlite_auto_profile_syslog, __sqlite_auto_trace, 
                       __sqlite_auto_trace_syslog, _sqlite3OsShmHasMultipleLinks, 
                       _sqlite3OsShmRenamedWhileOpen, _sqlite3OsShmWasTruncated, 
                       _sqlite3OsShmWasUnlinkedWhileOpen, _sqlite3VersionNumber, 
                       _sqlite3VersionString, _sqlite3_aggregate_context, 
                       _sqlite3_aggregate_count, _sqlite3_auto_extension, 
                       _sqlite3_backup_finish, _sqlite3_backup_init, _sqlite3_backup_pagecount, 
                       _sqlite3_backup_remaining, _sqlite3_backup_step, 
                       _sqlite3_bind_blob, _sqlite3_bind_blob64, _sqlite3_bind_double, 
                       _sqlite3_bind_int, _sqlite3_bind_int64, _sqlite3_bind_null, 
                       _sqlite3_bind_parameter_count, _sqlite3_bind_parameter_index, 
                       _sqlite3_bind_parameter_name, _sqlite3_bind_text, 
                       _sqlite3_bind_text16, _sqlite3_bind_text64, _sqlite3_bind_value, 
                       _sqlite3_bind_zeroblob, _sqlite3_blob_bytes, _sqlite3_blob_close, 
                       _sqlite3_blob_open, _sqlite3_blob_read, _sqlite3_blob_reopen, 
                       _sqlite3_blob_write, _sqlite3_busy_handler, _sqlite3_busy_timeout, 
                       _sqlite3_cancel_auto_extension, _sqlite3_changes, 
                       _sqlite3_clear_bindings, _sqlite3_close, _sqlite3_close_v2, 
                       _sqlite3_collation_needed, _sqlite3_collation_needed16, 
                       _sqlite3_column_blob, _sqlite3_column_bytes, _sqlite3_column_bytes16, 
                       _sqlite3_column_count, _sqlite3_column_decltype, 
                       _sqlite3_column_decltype16, _sqlite3_column_double, 
                       _sqlite3_column_int, _sqlite3_column_int64, _sqlite3_column_name, 
                       _sqlite3_column_name16, _sqlite3_column_text, _sqlite3_column_text16, 
                       _sqlite3_column_type, _sqlite3_column_value, _sqlite3_commit_hook, 
                       _sqlite3_compileoption_get, _sqlite3_compileoption_used, 
                       _sqlite3_complete, _sqlite3_complete16, _sqlite3_config, 
                       _sqlite3_context_db_handle, _sqlite3_create_collation, 
                       _sqlite3_create_collation16, _sqlite3_create_collation_v2, 
                       _sqlite3_create_function, _sqlite3_create_function16, 
                       _sqlite3_create_function_v2, _sqlite3_create_module, 
                       _sqlite3_create_module_v2, _sqlite3_data_count, 
                       _sqlite3_data_directory, _sqlite3_db_config, _sqlite3_db_filename, 
                       _sqlite3_db_handle, _sqlite3_db_mutex, _sqlite3_db_readonly, 
                       _sqlite3_db_release_memory, _sqlite3_db_status, 
                       _sqlite3_declare_vtab, _sqlite3_enable_shared_cache, 
                       _sqlite3_errcode, _sqlite3_errmsg, _sqlite3_errmsg16, 
                       _sqlite3_errstr, _sqlite3_exec, _sqlite3_expired, 
                       _sqlite3_extended_errcode, _sqlite3_extended_result_codes, 
                       _sqlite3_file_control, _sqlite3_finalize, _sqlite3_free, 
                       _sqlite3_free_table, _sqlite3_get_autocommit, _sqlite3_get_auxdata, 
                       _sqlite3_get_table, _sqlite3_global_recover, _sqlite3_initialize, 
                       _sqlite3_intarray_bind, _sqlite3_intarray_create, 
                       _sqlite3_interrupt, _sqlite3_last_insert_rowid, 
                       _sqlite3_libversion, _sqlite3_libversion_number, 
                       _sqlite3_limit, _sqlite3_log, _sqlite3_malloc, _sqlite3_malloc64, 
                       _sqlite3_memory_alarm, _sqlite3_memory_highwater, 
                       _sqlite3_memory_used, _sqlite3_mprintf, _sqlite3_msize, 
                       _sqlite3_mutex_alloc, _sqlite3_mutex_enter, _sqlite3_mutex_free, 
                       _sqlite3_mutex_leave, _sqlite3_mutex_try, _sqlite3_next_stmt, 
                       _sqlite3_open, _sqlite3_open16, _sqlite3_open_v2, 
                       _sqlite3_os_end, _sqlite3_os_init, _sqlite3_overload_function, 
                       _sqlite3_prepare, _sqlite3_prepare16, _sqlite3_prepare16_v2, 
                       _sqlite3_prepare_v2, _sqlite3_profile, _sqlite3_progress_handler, 
                       _sqlite3_randomness, _sqlite3_realloc, _sqlite3_realloc64, 
                       _sqlite3_release_memory, _sqlite3_reset, _sqlite3_reset_auto_extension, 
                       _sqlite3_result_blob, _sqlite3_result_blob64, _sqlite3_result_double, 
                       _sqlite3_result_error, _sqlite3_result_error16, 
                       _sqlite3_result_error_code, _sqlite3_result_error_nomem, 
                       _sqlite3_result_error_toobig, _sqlite3_result_int, 
                       _sqlite3_result_int64, _sqlite3_result_null, _sqlite3_result_text, 
                       _sqlite3_result_text16, _sqlite3_result_text16be, 
                       _sqlite3_result_text16le, _sqlite3_result_text64, 
                       _sqlite3_result_value, _sqlite3_result_zeroblob, 
                       _sqlite3_rollback_hook, _sqlite3_rtree_geometry_callback, 
                       _sqlite3_rtree_query_callback, _sqlite3_set_authorizer, 
                       _sqlite3_set_auxdata, _sqlite3_shutdown, _sqlite3_sleep, 
                       _sqlite3_snprintf, _sqlite3_soft_heap_limit, _sqlite3_soft_heap_limit64, 
                       _sqlite3_sourceid, _sqlite3_sql, _sqlite3_status, 
                       _sqlite3_status64, _sqlite3_step, _sqlite3_stmt_busy, 
                       _sqlite3_stmt_readonly, _sqlite3_stmt_status, _sqlite3_strglob, 
                       _sqlite3_stricmp, _sqlite3_strnicmp, _sqlite3_table_column_metadata, 
                       _sqlite3_temp_directory, _sqlite3_test_control, 
                       _sqlite3_thread_cleanup, _sqlite3_threadsafe, _sqlite3_total_changes, 
                       _sqlite3_trace, _sqlite3_transfer_bindings, _sqlite3_update_hook, 
                       _sqlite3_uri_boolean, _sqlite3_uri_int64, _sqlite3_uri_parameter, 
                       _sqlite3_user_data, _sqlite3_value_blob, _sqlite3_value_bytes, 
                       _sqlite3_value_bytes16, _sqlite3_value_double, _sqlite3_value_int, 
                       _sqlite3_value_int64, _sqlite3_value_numeric_type, 
                       _sqlite3_value_text, _sqlite3_value_text16, _sqlite3_value_text16be, 
                       _sqlite3_value_text16le, _sqlite3_value_type, _sqlite3_version, 
                       _sqlite3_vfs_find, _sqlite3_vfs_register, _sqlite3_vfs_unregister, 
                       _sqlite3_vmprintf, _sqlite3_vsnprintf, _sqlite3_vtab_config, 
                       _sqlite3_vtab_on_conflict, _sqlite3_wal_autocheckpoint, 
                       _sqlite3_wal_checkpoint, _sqlite3_wal_checkpoint_v2, 
                       _sqlite3_wal_hook ]
...

Encontré este y otros archivos .tbd en

Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/

También puede ver un archivo .tbd si va a la pestaña General de su proyecto Xcode y luego agrega una biblioteca en Marcos vinculados y Bibliotecas. El archivo .tbd se copiará a su proyecto.

Por lo tanto, parece que el archivo .dylib es la biblioteca real de código binario que está usando su proyecto y se encuentra en el directorio / usr / lib / en el dispositivo del usuario. El archivo .tbd, por otro lado, es solo un archivo de texto que se incluye en su proyecto y sirve como un enlace al binario .dylib requerido. Dado que este archivo de texto es mucho más pequeño que la biblioteca binaria, hace que el tamaño de descarga del SDK sea más pequeño.

En este punto, solo estoy deduciendo de la información proporcionada, así que corríjame si me equivoco.

Suragch
fuente
3
El formato de archivo TBD es en realidad solo un archivo YAML. El enlazador solo busca ciertas etiquetas.
C0deH4cker
55
¿Por qué reduce el tamaño de la aplicación? ¿No solo se vincula al dylib real de todos modos en el momento de la compilación / enlace? No digo que estés equivocado, solo trato de entender
stonedauwg
3
Reduce el tamaño del SDK que descargas con Xcode, no el tamaño de la aplicación que estás creando.
Joky
Gracias, @Joky. Corrija el error en mi respuesta. ¿Sabe en qué punto se agregan los binarios a la aplicación si no están en el SDK? Y de dónde vienen ellos? ¿Se descargan según sea necesario según los archivos .tbd que se usan?
Suragch
55
Las dylibs en el SDK están presentes en el dispositivo cuando se instala el sistema operativo. Por lo tanto, eran inútiles en el SDK, pero para permitir que el vinculador haga su trabajo cuando vincula la aplicación (las bibliotecas dinámicas no se copian en la aplicación y permanecen separadas). Por lo tanto, el cambio con los archivos tbd es quitar el dylib manteniendo solo la cantidad mínima de información utilizada por el vinculador y actualizando el vinculador para comprender este nuevo formato.
Joky
22

.dylib es el binario compilado que contiene el código de máquina. .tbd es un archivo de texto más pequeño, similar a un mapa de módulo multiplataforma.

Peter Lapisu
fuente
8
dónde aprendiste esto? ¿Tienes algún enlace que pueda investigar más sobre esto?
Suragch
2
solo mira el contenido de un .tds
Peter Lapisu
66
¿Es un archivo .tds lo mismo que un archivo .tdb? ¿Dónde encontraría tal archivo para ver su contenido?
Suragch
77
Es TBD, no TDS o TDB. Significa definición de dylib basada en texto.
craig65535
4

.tbd- Text Based dylib stubs. Es un tipo de optimización que significa que no tiene que copiar un .dylibarchivo (que existe en un destino) en su paquete (por ejemplo, la aplicación). Este archivo no contiene el código binario que tiene un impacto importante en el tamaño del archivo.

Es aplicable solo para:

  1. Dynamic libraries porque están vinculados en tiempo de ejecución
  2. El archivo debe tener una ruta relevante en el destino. Como resultado, es el mejor lugar para standard system libraries.

Para el desarrollo de iOS, puede encontrar archivos .tbd que puede usar aquí

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib

Por ejemplo libiconv.tbdparece

ingrese la descripción de la imagen aquí

Este archivo contiene información meta como:

  • .dylib ubicación
  • símbolos (propiedades de clase, métodos)
  • arquitectura
  • plataforma
yoAlex5
fuente
1
No contiene declaraciones de método. Solo los nombres de las clases y los nombres de las funciones libres exportadas desde la biblioteca.
Anton Kukoba