问题
Xcode 7 In Target > BuildPhases > Link Binary With Libraries > tap + button
When choosing frameworks to add, you cannot find *.dylib, you'll see *.tbd instead.
What is the reason for this?
**For people who need dylib, follow from this post
- Choose "Add other"
- Once in the file selection window do "CMD"+Shift+G (Go to folder) & type /usr/lib/
- From /user/lib you can find the *.dylib files
回答1:
I've scoured Google but the only thing I can find so far is the following quote from the Apple developer forums:
For those who are curious, the .tbd files are new "text-based stub libraries", that provide a much more compact version of the stub libraries for use in the SDK, and help to significantly reduce its download size.
Hopefully more documentation will be coming soon.
Update
As an example, here is the entire contents of libsqlite3.tbd. It is just a text file. Note that the install-name is 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 ]
...
I found this and other .tbd files in
Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
You can also see a .tbd file if you go to the General tab of your Xcode project and then add a library under Linked Frameworks and Libraries. The .tbd file will be copied to your project.
So it appears that the .dylib file is the actual library of binary code that your project is using and is located in the /usr/lib/ directory on the user's device. The .tbd file, on the other hand, is just a text file that is included in your project and serves as a link to the required .dylib binary. Since this text file is much smaller than the binary library, it makes the SDK's download size smaller.
At this point I am only surmising from the information given, so please correct me if I am wrong.
回答2:
.dylib is the compiled binary that contains the machine code. .tbd is a smaller text file, similar to a cross-platform module map.
回答3:
.tbd
- Text Based dylib stubs
. It is a kind of optimization that allows do not copy a .dylib
file (which exists on a target) into your bundle(e.g. application). This file does not have binary code that has a size effect
It is applicable only for:
- dynamic libraries because they are runtime linked
- file should has a relevant path on the target. As a result it is the best place for standard system libraries.
For iOS development you can find .tbd files which you can use here
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib
For example libiconv.tbd
looks like
This file contains some meta information like:
.dylib
location- method declaration
- architecture
- platform
来源:https://stackoverflow.com/questions/31450690/why-xcode-7-shows-tbd-instead-of-dylib