Perché Xcode 7 mostra * .tbd invece di * .dylib?


138

Xcode 7 In Target> BuildPhases> Collega binario con librerie> tocca + pulsante

Quando scegli i framework da aggiungere, non puoi trovare * .dylib, vedrai invece * .tbd.

Qual è la ragione di ciò?

** Per le persone che hanno bisogno di Dylib, segui questo post

  1. Scegli "Aggiungi altro"
  2. Una volta nella finestra di selezione dei file, fai "CMD" + Maiusc + G (Vai alla cartella) e digita / usr / lib /
  3. Da / user / lib puoi trovare i file * .dylib

11
Fa tutto parte del "piano segreto" di Apple ...
L'L'l

aggiungendo * .dylib da / usr / lib / Questo funziona solo per me quando eseguo la mia app sul simulatore, non funziona con il dispositivo.
keshav vishwkarma,

Risposte:


153

Ho setacciato Google, ma l'unica cosa che posso trovare finora è la seguente citazione dai forum degli sviluppatori Apple :

Per coloro che sono curiosi, i file .tbd sono nuove "librerie di stub basate su testo", che forniscono una versione molto più compatta delle librerie di stub da utilizzare nell'SDK e aiutano a ridurne significativamente le dimensioni di download.

Speriamo che presto arriverà più documentazione.

Aggiornare

Ad esempio, ecco l'intero contenuto di libsqlite3.tbd . È solo un file di testo. Si noti che il nome di installazione è 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 ]
...

Ho trovato questo e altri file .tbd in

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

Puoi anche vedere un file .tbd se vai nella scheda Generale del tuo progetto Xcode e quindi aggiungi una libreria in Strutture e librerie collegate. Il file .tbd verrà copiato nel tuo progetto.

Quindi sembra che il file .dylib sia l'effettiva libreria di codice binario che il progetto sta usando e che si trova nella directory / usr / lib / sul dispositivo dell'utente. Il file .tbd, d'altra parte, è solo un file di testo che è incluso nel progetto e funge da collegamento al binario .dylib richiesto. Poiché questo file di testo è molto più piccolo della libreria binaria, riduce le dimensioni del download dell'SDK.

A questo punto sto solo ipotizzando dalle informazioni fornite, quindi per favore correggimi se sbaglio.


3
Il formato del file TBD è in realtà solo un file YAML. Il linker cerca solo alcuni tag.
C0deH4cker,

5
Perché riduce le dimensioni dell'app? Non si collega semplicemente al vero dylib comunque in fase di compilazione / collegamento? Non dicendo che ti sbagli, sto solo cercando di capire
stonedauwg,

3
Riduce le dimensioni dell'SDK scaricato con Xcode, non le dimensioni dell'app che stai creando.
Joky,

Grazie, @Joky. Ho corretto l'errore nella mia risposta. Sai a che punto i binari vengono aggiunti all'app se non si trovano nell'SDK? E da dove vengono? Vengono scaricati secondo necessità a seconda dei file .tbd utilizzati?
Suragch

5
I dylibs nell'SDK sono presenti sul dispositivo quando è installato il sistema operativo. Quindi erano inutili nell'SDK, ma per consentire al linker di fare il suo lavoro quando si collega l'app (le librerie dinamiche non vengono copiate nell'app e rimangono separate). Quindi la modifica con i file tbd è di rimuovere il dylib mantenendo solo la quantità minima di informazioni utilizzate dal linker e aggiornando il linker per comprendere questo nuovo formato.
Joky

22

.dylib è il file binario compilato che contiene il codice macchina. .tbd è un file di testo più piccolo, simile a una mappa del modulo multipiattaforma.


8
Dove l'hai imparato? Hai qualche link che potrei cercare di più al riguardo?
Suragch,

2
guarda il contenuto di un .tds
Peter Lapisu il

6
Un file .tds è uguale a un file .tdb? Dove troverei un file del genere per esaminarne il contenuto?
Suragch,

7
È TBD, non TDS o TDB. Indica la definizione di dylib basata su testo.
craig65535,

4

.tbd- Text Based dylib stubs. È un tipo di ottimizzazione che significa che non è necessario copiare un .dylibfile (che esiste su una destinazione) nel pacchetto (ad es. Applicazione). Questo file non contiene il codice binario che ha un impatto importante sulla dimensione del file.

È applicabile solo per:

  1. Dynamic libraries perché sono collegati in runtime
  2. Il file dovrebbe avere un percorso rilevante sulla destinazione. Di conseguenza è il posto migliore per standard system libraries.

Per lo sviluppo di iOS puoi trovare file .tbd che puoi usare qui

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

Ad esempio libiconv.tbdsembra

inserisci qui la descrizione dell'immagine

Questo file contiene alcune meta informazioni come:

  • .dylib Posizione
  • simboli (proprietà della classe, metodi)
  • architettura
  • piattaforma

1
non contiene dichiarazioni di metodi. Solo i nomi delle classi e i nomi delle funzioni libere esportate dalla libreria.
Anton Kukoba,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.