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


138

目标中的Xcode 7> BuildPhases>使用库链接二进制文件>点击+按钮

选择要添加的框架时,找不到* .dylib,而是看到* .tbd。

这是什么原因呢?

**对于需要dylib的人,请遵循此帖子

  1. 选择“添加其他”
  2. 在文件选择窗口中,执行“ CMD” + Shift + G(转到文件夹)并输入/ usr / lib /
  3. 在/ user / lib中,您可以找到* .dylib文件

11
这都是苹果“秘密计划”的一部分 ……
l'L'l

从/ usr / lib /添加* .dylib这仅对我有用,仅在模拟器上运行我的应用程序时,对设备不起作用。
keshav vishwkarma 2015年

Answers:


153

我曾搜寻过Google,但到目前为止,我唯一能找到的是Apple开发者论坛上的以下引文

对于那些好奇的人来说,.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项目的“常规”选项卡,然后在“链接的框架和库”下添加一个库,则还可以看到.tbd文件。.tbd文件将被复制到您的项目中。

因此,看来.dylib文件是您的项目正在使用的实际二进制代码库,并且位于用户设备上的/ usr / lib /目录中。另一方面,.tbd文件只是项目中包含的文本文件,并用作所需.dylib二进制文件的链接。由于此文本文件比二进制库小得多,因此可以减小SDK的下载大小。

目前,我只是从给出的信息中推测,因此,如果我错了,请纠正我。


3
TBD文件格式实际上只是一个YAML文件。链接器仅查找某些标签。
C0deH4cker

5
为什么它会使应用程序尺寸变小?难道不是在编译/链接时才链接到真正的dylib吗?不是说您错了,而是试图理解
stonedauwg

3
它减少了您使用Xcode下载的SDK的大小,而不是您正在构建的应用程序的大小。
Joky

谢谢@Joky。我更正了答案中的错误。您知道二进制文件在什么时候被添加到应用程序中吗?它们来自哪里?根据使用的.tbd文件,是否根据需要下载了它们?
Suragch

5
安装操作系统后,SDK中的dylib将出现在设备上。因此它们在SDK中没有用,但是允许链接器在链接应用程序时完成其工作(动态库不会复制到应用程序中并保持分隔)。因此,使用tbd文件进行的更改是剥离dylib,仅保留链接器使用的最少信息量,并更新链接器以了解这种新格式。
Joky

22

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


8
您从哪里学到的?您是否有任何链接可以进一步研究?
Suragch

2
看看.tds的内容
Peter Lapisu 2015年

6
.tds文件与.tdb文件相同吗?我在哪里可以找到这样的文件以查看其内容?
Suragch 2015年

7
它是TBD,不是TDS或TDB。它代表基于文本的dylib定义。
craig65535 '17

4

.tbd- Text Based dylib stubs。这是一种优化,这意味着您不必将.dylib文件(存在于目标中)复制到包(例如应用程序)中。该文件不包含对文件大小有重大影响的二进制代码。

它仅适用于:

  1. Dynamic libraries 因为它们是运行时链接的
  2. 文件应在目标上具有相关路径。因此,它是的最佳去处standard system libraries

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

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

例如libiconv.tbd看起来像

在此处输入图片说明

该文件包含一些元信息,例如:

  • .dylib 位置
  • 符号(类的属性,方法)
  • 建筑
  • 平台

1
它不包含方法声明。只有类的名称和从库中导出的自由函数的名称。
安东·库科巴
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.