为什么Xcode 7显示*.tbd而不是*.dylib?

148

Xcode 7 在Target > BuildPhases > Link Binary With Libraries > 点击 + 按钮

当选择要添加的框架时,你无法找到 *.dylib 文件,而是看到了 *.tbd 文件。

这是什么原因?

**对于需要 dylib 的人,请参考此 帖子

  1. 选择 "Add other"
  2. 在文件选择窗口中按 "CMD" + Shift+G (前往文件夹) 并键入 /usr/lib/
  3. 从 /user/lib 文件夹中可以找到 *.dylib 文件。

16
这都是苹果公司的“秘密计划”的一部分。 - l'L'l
1
将 /usr/lib/ 中的 *.dylib 添加进来。这只在模拟器上运行我的应用程序时有效,无法在设备上运行。 - keshav vishwkarma
4个回答

160
我已经在谷歌上搜索过了,但是目前我只能找到以下苹果开发者论坛的引用:
对于那些好奇的人来说,.tbd文件是新的“基于文本的存根库”,它提供了一个更紧凑的版本的存根库,用于SDK,并帮助显着减少其下载大小。
希望很快会有更多的文档出现。
更新
作为示例,这里是整个libsqlite3.tbd的内容。它只是一个文本文件。请注意,安装名称为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 ]
...

我在这里以及其他地方找到了.tbd文件。

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

如果您前往Xcode项目的“General”选项卡,然后在“Linked Frameworks and Libraries”下添加库,您还可以看到一个.tbd文件。 .tbd文件将被复制到您的项目中。
因此,似乎.dylib文件是您的项目实际使用的二进制代码库,位于用户设备上的/usr/lib/目录中。 另一方面,.tbd文件只是一个文本文件,包含在您的项目中,并作为所需.dylib二进制文件的链接。 由于这个文本文件比二进制库小得多,它使SDK的下载大小更小。
在这一点上,我只是根据所给信息推测,如果我错了,请纠正我。

4
TBD 文件格式实际上只是一个 YAML 文件,连接器只会寻找特定的标签。 - C0deH4cker
5
这个操作为什么会使应用程序大小变小呢?编译/链接时不是还是会链接到真正的动态库吗?我并没有说你错了,只是想理解一下。 - stonedauwg
5
它减小了你在使用Xcode下载的SDK的大小,而不是你正在构建的应用程序的大小。 - Joky
5
SDK中的动态链接库(dylibs)在操作系统安装时就已经存在于设备上了。因此它们在SDK中是无用的,但是为了让链接器在应用程序链接时发挥作用(动态库不会被复制到应用程序中并保持分离状态),我们需要这些dylib。tbd文件的改变是剥离(dylib)只保留链接器使用的最少信息,并更新链接器以理解这种新格式。 - Joky
从阅读这个页面,我理解的是它与减小我的应用程序或框架大小没有任何关系,而是指苹果SDK通过依赖于操作系统提供的.dylib来减小其自身的大小。或者也许我不知道这里的SDK是什么意思。 - Ben Butterworth
显示剩余4条评论

23

.dylib是包含机器代码的已编译二进制文件。.tbd是一个更小的文本文件,类似于跨平台模块映射。


8
你是从哪里学到这个的?你有一些相关链接可以让我深入了解吗? - Suragch
2
只需查看.tds文件的内容。 - Peter Lapisu
6
.tds文件和.tdb文件一样吗?我在哪里可以找到这样的文件以便查看其内容? - Suragch
8
它是TBD,不是TDS或TDB。它代表基于文本的dylib定义。 - craig65535
什么是跨平台?为什么普通的.modulemap.tbd更不跨平台? - Ben Butterworth

7

基于文本的dylib stubs(.tbd)

这是一种优化方式,意味着您不需要将一个存在于目标平台上的 .dylib 文件复制到您的捆绑包(例如应用程序)中。该文件不包含二进制代码,因此对文件大小有重大影响。

它仅适用于:

  1. 动态库,因为它们在运行时链接
  2. 文件在目标平台上具有相关路径。因此,这是使用 标准系统库 的最佳位置。

对于iOS开发,您可以在此处找到您可以使用的.tbd文件。

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

例如,libiconv.tbd看起来像这样: enter image description here 该文件包含一些元信息,如:
- .dylib位置 - 符号(类的属性、方法) - 架构 - 平台

2
仅包含类名和从库中导出的自由函数名称,不包括方法声明。 - Anton Kukoba

1

符号由主体和名称组成。如果您删除函数的主体,则可以节省空间。

由于操作系统已经为其自己的Apple库编译了编译后的库,因此在编译过程中不需要包含主体。安装时,操作系统(模拟器或实际设备)将其链接到实际的dylib。

它们很像symlink / shortcut,但是指向库。

所以说我们有动态库,它们是Mach-O文件,公开可执行文件使用的代码和数据片段。这些作为系统的一部分分发。那就是我们的框架。你们中的许多人也使用自己的框架。还有TBD文件或基于文本的dylib存根。那么它们是什么呢?好吧,在制作iOS和macOS的SDK时,我们拥有所有这些dylibs和所有这些伟大的功能,如MapKit和WebKit,您可能想要使用。但是,我们不想随着SDK一起发布它们的整个副本,因为它很大。编译器和链接器不需要它,它只需要在运行程序时。因此,我们创建了所谓的存根dylib,在其中删除了所有符号的主体,只保留了名称。然后我们对它们进行了文本表示,更容易使用。目前,它们仅用于分发SDK以减少大小。因此,您可能会在项目中看到它们,但您不必担心它们。它们只包含符号。来自《Xcode构建过程的幕后》- 48:38

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接