Why Xcode 7 Shows *.Tbd Instead of *.Dylib

Why Xcode 7 shows *.tbd instead of *.dylib?

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.

Is libsqlite3.tbd the same as libsqlite3.dylib?

In Xcode 7, it replaces the use of .dylib with .tbd. Just use the .tbd.

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 significantly reduce its download size.

Reference: https://forums.developer.apple.com/message/8609#8609

libsqlite3.dylib and libz.dylib missing in Xcode 7. How do I use Parse?

As for Xcode 7 b4:
To add Parse support into existing project, follow the Parse "Set up the SDK" for existing project and to add the libz and libsqlite3 libs, use:

  • Go to Build Phases > Link Binary with Libraries > + > Add other
  • While in the file selection window press: "command"+shift+G (i.e. Go to folder) and type /usr/lib/
  • From /user/lib find and add : libz.dylib and libsqlite3.dylib

Please note!: Also make sure ATS works for you - this is new in iOS9!, see more info for example at NSURLSession "HTTP load failed kCFStreamErrorDomainSSL, -9813 ; Self signing certificate

What actually happens when I add libcurl.4.tbd as a dependency in xcode?

All the built-in libraries ship in one big cache file on macOS (at least in Big Sur, not sure on earlier systems) and iOS (since iPhone OS 3.1). More information is available in the iPhone Dev Wiki.

To find the actual location of the cache on your machine, run your compiled executable with the DYLD_PRINT_SEGMENTS environment variable set. This will produce a lot of output on stderr, like this:

% DYLD_PRINT_SEGMENTS=1 ./your_executable
re-using existing shared cache (/System/Library/dyld/dyld_shared_cache_x86_64h):
0x7FFF2003B000->0x7FFF7FFBAFFF init=5, max=5 read execute
0x7FFF8003B000->0x7FFF8DFDEFFF init=3, max=3 read write data
0x7FFFC003B000->0x7FFFE22DAFFF init=1, max=1 read
dyld: Main executable mapped /Users/janten/Desktop/linky/./a.out
__PAGEZERO at 0x00000000->0x100000000
__TEXT at 0x106305000->0x106309000
__DATA_CONST at 0x106309000->0x10630D000
__DATA at 0x10630D000->0x106311000
__LINKEDIT at 0x106311000->0x106315000
dyld: Using shared cached for /usr/lib/libcurl.4.dylib
__TEXT at 0x7FFF32F8F000->0x7FFF32FF5000
__DATA at 0x7FFF89A67070->0x7FFF89A6A04C
__LINKEDIT at 0x7FFFC05FF000->0x7FFFDEF17CB0
...

In this example, the cache is located in /System/Library/dyld/dyld_shared_cache_x86_64h. If you want to see the complete content of this file, look at /System/Library/dyld/dyld_shared_cache_x86_64h.map, which contains a plain-text memory mapping for all libraries in the cache.

libstdc++.6.0.0.tbd or .dylib

When you add the library, rather than hunt though the list, just press "Add Other" then manually navigate to /usr/lib or just press "CMD + Shift + G" then type in "/usr/lib/libstdc++.dylib"

Missing two dylib, but no Xcode linking errors

sqlite3.0.dylib and libSystem.B.dylib are system libs. Project navigator and dylib search paths are different things. Project navigator as the name says is used to navigate the project so it is more or less a tool for the developer to easy navigate a project. Usually it also shows your linked libs, but they keep a path to those frameworks and the path is no longer valid in your case. On the other hand there is Framework Search Paths which you can find in Build settings. There are the paths where the linker searches for the expected libraries. But since your libs are from the system you don't even need to specify a Framework search path because paths to system libs are set by default, so for system libs you just have to specify that you want to link them to your project. So you can safely remove those red libs from your project navigator. And as long as it is specified in your settings that you want to use those libs in Link Binary With Libraries the whole thing should work.



Related Topics



Leave a reply



Submit