Pourquoi Xcode 7 affiche * .tbd au lieu de * .dylib?

138

Xcode 7 Dans Target> BuildPhases> Lier le binaire avec les bibliothèques> appuyez sur le bouton +

Lors du choix des frameworks à ajouter, vous ne pouvez pas trouver * .dylib, vous verrez * .tbd à la place.

Quelle est la raison pour ça?

** Pour les personnes qui ont besoin de dylib, suivez ce post

  1. Choisissez "Ajouter autre"
  2. Une fois dans la fenêtre de sélection de fichier, faites "CMD" + Shift + G (Aller au dossier) et tapez / usr / lib /
  3. Depuis / user / lib, vous pouvez trouver les fichiers * .dylib
Ted
la source
11
Ça fait partie du "plan secret" d' Apples ...
l'L'l
ajouter * .dylib depuis / usr / lib / Cela ne fonctionne que pour moi lorsque j'exécute mon application sur le simulateur, cela ne fonctionne pas avec l'appareil.
keshav vishwkarma

Réponses:

153

J'ai parcouru Google, mais la seule chose que je peux trouver jusqu'à présent est la citation suivante des forums de développeurs Apple :

Pour ceux qui sont curieux, les fichiers .tbd sont de nouvelles "bibliothèques de stub basées sur du texte", qui fournissent une version beaucoup plus compacte des bibliothèques de stub à utiliser dans le SDK, et aident à réduire considérablement sa taille de téléchargement.

Espérons que plus de documentation arrivera bientôt.

Mettre à jour

A titre d'exemple, voici l'intégralité du contenu de libsqlite3.tbd . C'est juste un fichier texte. Notez que le nom d'installation est 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 ]
...

J'ai trouvé ceci et d'autres fichiers .tbd dans

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

Vous pouvez également voir un fichier .tbd si vous accédez à l'onglet Général de votre projet Xcode, puis ajoutez une bibliothèque sous Frameworks et bibliothèques liés. Le fichier .tbd sera copié dans votre projet.

Il semble donc que le fichier .dylib soit la bibliothèque réelle de code binaire que votre projet utilise et se trouve dans le répertoire / usr / lib / sur l'appareil de l'utilisateur. Le fichier .tbd, en revanche, n'est qu'un fichier texte inclus dans votre projet et sert de lien vers le binaire .dylib requis. Étant donné que ce fichier texte est beaucoup plus petit que la bibliothèque binaire, il réduit la taille de téléchargement du SDK.

À ce stade, je ne fais que supposer à partir des informations fournies, veuillez donc me corriger si je me trompe.

Suragch
la source
3
Le format de fichier TBD est en fait juste un fichier YAML. L'éditeur de liens recherche simplement certaines balises.
C0deH4cker
5
Pourquoi réduit-il la taille de l'application? N'est-il pas juste lié au vrai dylib de toute façon au moment de la compilation / liaison? Ne dites pas que vous avez tort, essayez simplement de comprendre
stonedauwg
3
Cela réduit la taille du SDK que vous téléchargez avec Xcode, pas la taille de l'application que vous créez.
Joky
Merci, @Joky. J'ai corrigé l'erreur dans ma réponse. Savez-vous à quel moment les binaires sont ajoutés à l'application s'ils ne sont pas dans le SDK? Et d'où viennent-ils? Sont-ils téléchargés selon les besoins en fonction des fichiers .tbd utilisés?
Suragch
5
Les dylibs du SDK sont présents sur l'appareil lorsque le système d'exploitation est installé. Ils étaient donc inutiles dans le SDK, mais pour permettre à l'éditeur de liens de faire son travail lorsque vous liez l'application (les bibliothèques dynamiques ne sont pas copiées dans l'application et restent séparées). Ainsi, le changement avec les fichiers tbd consiste à supprimer le dylib en ne gardant que la quantité minimale d'informations qui a été utilisée par l'éditeur de liens, et en mettant à jour l'éditeur de liens pour comprendre ce nouveau format.
Joky
22

.dylib est le binaire compilé qui contient le code machine. .tbd est un fichier texte plus petit, similaire à une carte de module multiplateforme.

Peter Lapisu
la source
8
Où avez-vous appris cela? Avez-vous des liens que je pourrais rechercher plus à ce sujet?
Suragch
2
il suffit de regarder le contenu d'un .tds
Peter Lapisu
6
Un fichier .tds est-il identique à un fichier .tdb? Où trouverais-je un tel fichier afin de consulter son contenu?
Suragch
7
C'est à déterminer, pas TDS ou TDB. Il représente la définition de dylib basée sur du texte.
craig65535
4

.tbd- Text Based dylib stubs. C'est une sorte d'optimisation qui signifie que vous n'avez pas à copier un .dylibfichier (qui existe sur une cible) dans votre bundle (par exemple une application). Ce fichier ne contient pas le code binaire qui a un impact majeur sur la taille du fichier.

Il n'est applicable que pour:

  1. Dynamic libraries parce qu'ils sont liés à l'exécution
  2. Le fichier doit avoir un chemin d'accès pertinent sur la cible. En conséquence, c'est le meilleur endroit pour standard system libraries.

Pour le développement iOS, vous pouvez trouver des fichiers .tbd que vous pouvez utiliser ici

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

Par exemple libiconv.tbdressemble à

entrez la description de l'image ici

Ce fichier contient des méta-informations telles que:

  • .dylib emplacement
  • symboles (propriétés de classe, méthodes)
  • architecture
  • Plate-forme
yoAlex5
la source
1
il ne contient pas de déclarations de méthode. Seuls les noms des classes et les noms des fonctions libres exportées depuis la bibliothèque.
Anton Kukoba