Warum zeigt Xcode 7 * .tbd anstelle von * .dylib?

138

Xcode 7 Tippen Sie unter Ziel> BuildPhases> Binär mit Bibliotheken verknüpfen> auf die Schaltfläche +

Wenn Sie Frameworks zum Hinzufügen auswählen, können Sie * .dylib nicht finden. Stattdessen wird * .tbd angezeigt.

Was ist der Grund dafür?

** Für Leute, die Dylib brauchen, folgen Sie diesem Beitrag

  1. Wählen Sie "Andere hinzufügen"
  2. Sobald Sie im Dateiauswahlfenster "CMD" + Umschalt + G (Gehe zu Ordner) und geben Sie / usr / lib / ein
  3. Unter / user / lib finden Sie die * .dylib-Dateien
Ted
quelle
11
Es ist alles Teil von Apples "geheimem Plan" ...
l'L'l
Hinzufügen von * .dylib aus / usr / lib / Dies funktioniert nur, wenn ich meine App auf dem Simulator ausführe, es funktioniert nicht mit dem Gerät.
Keshav Vishwkarma

Antworten:

153

Ich habe Google durchsucht, aber das einzige, was ich bisher finden kann, ist das folgende Zitat aus den Apple-Entwicklerforen :

Für diejenigen, die neugierig sind, sind die .tbd-Dateien neue "textbasierte Stub-Bibliotheken", die eine viel kompaktere Version der Stub-Bibliotheken zur Verwendung im SDK bereitstellen und dazu beitragen, die Downloadgröße erheblich zu reduzieren.

Hoffentlich wird bald mehr Dokumentation kommen.

Aktualisieren

Hier ist als Beispiel der gesamte Inhalt von libsqlite3.tbd . Es ist nur eine Textdatei. Beachten Sie, dass der Installationsname libsqlite3.dylib lautet .

---
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 ]
...

Ich habe diese und andere .tbd-Dateien in gefunden

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

Sie können auch eine .tbd-Datei anzeigen, wenn Sie zur Registerkarte Allgemein Ihres Xcode-Projekts gehen und dann unter Verknüpfte Frameworks und Bibliotheken eine Bibliothek hinzufügen. Die .tbd-Datei wird in Ihr Projekt kopiert.

Es scheint also, dass die .dylib-Datei die eigentliche Bibliothek von Binärcode ist, die Ihr Projekt verwendet, und sich im Verzeichnis / usr / lib / auf dem Gerät des Benutzers befindet. Die .tbd-Datei ist dagegen nur eine Textdatei, die in Ihrem Projekt enthalten ist und als Link zur erforderlichen .dylib-Binärdatei dient. Da diese Textdatei viel kleiner als die Binärbibliothek ist, wird die Downloadgröße des SDK kleiner.

An dieser Stelle vermute ich nur die angegebenen Informationen. Bitte korrigieren Sie mich, wenn ich falsch liege.

Suragch
quelle
3
Das TBD-Dateiformat ist eigentlich nur eine YAML-Datei. Der Linker sucht nur nach bestimmten Tags.
C0deH4cker
5
Warum wird die App kleiner? Verknüpft es nicht trotzdem zur Kompilierungs- / Verknüpfungszeit mit der echten Dylib? Nicht sagen, dass Sie falsch liegen, nur versuchen zu verstehen
stonedauwg
3
Es reduziert die Größe des SDK, das Sie mit Xcode herunterladen, nicht die Größe der App, die Sie erstellen.
Joky
Danke, @Joky. Ich habe den Fehler in meiner Antwort korrigiert. Wissen Sie, wann die Binärdateien zur App hinzugefügt werden, wenn sie nicht im SDK enthalten sind? Und woher kommen sie? Werden sie je nach Verwendung der verwendeten TBD-Dateien nach Bedarf heruntergeladen?
Suragch
5
Die Dylibs im SDK sind auf dem Gerät vorhanden, wenn das Betriebssystem installiert ist. Sie waren im SDK also nutzlos, aber damit der Linker seine Arbeit erledigen kann, wenn Sie die App verknüpfen (dynamische Bibliotheken werden nicht in die App kopiert und bleiben getrennt). Die Änderung bei TBD-Dateien besteht also darin, die Dylib zu entfernen, nur die minimale Menge an Informationen beizubehalten, die vom Linker verwendet wurden, und den Linker zu aktualisieren, um dieses neue Format zu verstehen.
Joky
22

.dylib ist die kompilierte Binärdatei, die den Maschinencode enthält. .tbd ist eine kleinere Textdatei, ähnlich einer plattformübergreifenden Modulzuordnung.

Peter Lapisu
quelle
8
Wo hast du das gelernt? Haben Sie Links, über die ich mehr recherchieren könnte?
Suragch
2
Schauen Sie sich einfach den Inhalt eines .tds an
Peter Lapisu
6
Ist eine .tds-Datei mit einer .tdb-Datei identisch? Wo würde ich eine solche Datei finden, um ihren Inhalt zu sehen?
Suragch
7
Es ist TBD, nicht TDS oder TDB. Es steht für textbasierte Dylib-Definition.
craig65535
4

.tbd- Text Based dylib stubs. Dies ist eine Art Optimierung, bei der Sie keine .dylibDatei (die auf einem Ziel vorhanden ist) in Ihr Bundle (z. B. eine Anwendung) kopieren müssen . Diese Datei enthält keinen Binärcode, der einen großen Einfluss auf die Dateigröße hat.

Es gilt nur für:

  1. Dynamic libraries weil sie zur Laufzeit verknüpft sind
  2. Die Datei sollte einen relevanten Pfad auf dem Ziel haben. Infolgedessen ist es der beste Ort für standard system libraries.

Für die iOS-Entwicklung finden Sie .tbd-Dateien, die Sie hier verwenden können

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

Zum Beispiel libiconv.tbdsieht aus wie

Geben Sie hier die Bildbeschreibung ein

Diese Datei enthält einige Metainformationen wie:

  • .dylib Ort
  • Symbole (Eigenschaften, Methoden der Klasse)
  • die Architektur
  • Plattform
yoAlex5
quelle
1
Es enthält keine Methodendeklarationen. Nur die Namen der Klassen und die Namen der freien Funktionen, die aus der Bibliothek exportiert wurden.
Anton Kukoba