Tại sao Xcode 7 hiển thị * .tbd thay vì * .dylib?


138

Xcode 7 Trong Target> BuildPhase> Liên kết nhị phân với thư viện> nhấn + nút

Khi chọn các khung để thêm, bạn không thể tìm thấy * .dylib, thay vào đó bạn sẽ thấy * .tbd.

Lý do cho điều này là gì?

** Đối với những người cần dylib, hãy theo dõi bài viết này

  1. Chọn "Thêm khác"
  2. Khi ở trong cửa sổ chọn tệp, hãy thực hiện "CMD" + Shift + G (Chuyển đến thư mục) & gõ / usr / lib /
  3. Từ / user / lib bạn có thể tìm thấy các tệp * .dylib

11
Tất cả đều là một phần của "kế hoạch bí mật" của Táo ...
Tôi sẽ là

thêm * .dylib từ / usr / lib / Điều này chỉ hoạt động với tôi khi chạy ứng dụng của tôi trên trình giả lập, nó không hoạt động với thiết bị.
keshav vishwkarma

Câu trả lời:


153

Tôi đã truy quét Google nhưng điều duy nhất tôi có thể tìm thấy cho đến nay là trích dẫn sau đây từ các diễn đàn nhà phát triển của Apple :

Đối với những người tò mò, các tệp .tbd là "thư viện gốc dựa trên văn bản" mới, cung cấp phiên bản nhỏ gọn hơn của các thư viện gốc để sử dụng trong SDK và giúp giảm đáng kể kích thước tải xuống của nó.

Hy vọng nhiều tài liệu sẽ đến sớm.

Cập nhật

Ví dụ, đây là toàn bộ nội dung của libsqlite3.tbd . Nó chỉ là một tập tin văn bản. Lưu ý rằng tên cài đặt là 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 ]
...

Tôi tìm thấy tệp này và các tệp .tbd khác trong

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

Bạn cũng có thể thấy tệp .tbd nếu bạn đi đến tab Chung của dự án Xcode của bạn và sau đó thêm thư viện trong Khung và Thư viện được liên kết. Tệp .tbd sẽ được sao chép vào dự án của bạn.

Vì vậy, có vẻ như tệp .dylib là thư viện mã nhị phân thực tế mà dự án của bạn đang sử dụng và nằm trong thư mục / usr / lib / trên thiết bị của người dùng. Mặt khác, tệp .tbd chỉ là một tệp văn bản được bao gồm trong dự án của bạn và đóng vai trò là một liên kết đến tệp nhị phân .dylib cần thiết. Vì tệp văn bản này nhỏ hơn nhiều so với thư viện nhị phân, nó làm cho kích thước tải xuống của SDK nhỏ hơn.

Tại thời điểm này tôi chỉ phỏng đoán từ thông tin được cung cấp, vì vậy hãy sửa cho tôi nếu tôi sai.


3
Định dạng tệp TBD thực sự chỉ là một tệp YAML. Trình liên kết chỉ tìm kiếm các thẻ nhất định.
C0deH4cker

5
Tại sao nó làm cho kích thước ứng dụng nhỏ hơn? Không phải nó chỉ liên kết với dylib thực sự vào lúc biên dịch / liên kết sao? Không nói rằng bạn sai, chỉ cần cố gắng để hiểu
ném đá vào

3
Nó giảm kích thước của SDK bạn tải xuống bằng Xcode chứ không phải kích thước của ứng dụng bạn đang xây dựng.
Joky

Cảm ơn, @Joky. Tôi đã sửa lỗi trong câu trả lời của tôi. Bạn có biết tại thời điểm nào các nhị phân được thêm vào ứng dụng nếu chúng không có trong SDK không? Và họ đến từ đâu? Chúng có được tải xuống khi cần tùy thuộc vào tập tin .tbd nào được sử dụng không?
Suragch

5
Các dylib trong SDK có mặt trên thiết bị khi HĐH được cài đặt. Vì vậy, chúng vô dụng trong SDK, nhưng để cho phép trình liên kết thực hiện công việc của nó khi bạn liên kết ứng dụng (các thư viện động không được sao chép vào ứng dụng và tách biệt). Vì vậy, thay đổi với các tệp tbd là loại bỏ dylib chỉ giữ lượng thông tin tối thiểu được sử dụng bởi trình liên kết và cập nhật trình liên kết để hiểu định dạng mới này.
Joky

22

.dylib là tệp nhị phân được biên dịch có chứa mã máy. .tbd là một tệp văn bản nhỏ hơn, tương tự như bản đồ mô-đun đa nền tảng.


8
Bạn đã học cái này ở đâu? Bạn có bất kỳ liên kết mà tôi có thể nghiên cứu thêm về điều này?
Suragch

2
chỉ cần nhìn vào nội dung của một .tds
Peter Lapisu

6
Là một tệp .tds giống như một tệp .tdb? Tôi sẽ tìm một tập tin như vậy ở đâu để xem nội dung của nó?
Suragch

7
Đó là TBD, không phải TDS hay TDB. Nó là viết tắt của định nghĩa dylib dựa trên văn bản.
craig65535

4

.tbd- Text Based dylib stubs. Đây là một loại tối ưu hóa có nghĩa là bạn không phải sao chép một .dylibtệp (tồn tại trên mục tiêu) vào gói của bạn (ví dụ: ứng dụng). Tệp này không chứa mã nhị phân có ảnh hưởng lớn đến kích thước tệp.

Nó chỉ áp dụng cho:

  1. Dynamic libraries bởi vì chúng được liên kết với thời gian chạy
  2. Tập tin nên có một đường dẫn liên quan đến mục tiêu. Kết quả là nó là nơi tốt nhất cho standard system libraries.

Để phát triển iOS, bạn có thể tìm thấy các tệp .tbd mà bạn có thể sử dụng ở đây

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

Ví dụ libiconv.tbdnhư

nhập mô tả hình ảnh ở đây

Tập tin này chứa một số thông tin meta như:

  • .dylib vị trí
  • ký hiệu (thuộc tính, phương thức của lớp)
  • ngành kiến ​​trúc
  • nền tảng

1
nó không chứa các khai báo phương thức. Chỉ tên của các lớp và tên của các hàm miễn phí được xuất từ ​​thư viện.
Anton Kukoba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.