Por que o Xcode 7 mostra * .tbd em vez de * .dylib?

138

Xcode 7 No Target> BuildPhases> Link Binary With Libraries> toque no botão +

Ao escolher estruturas a serem adicionadas, você não pode encontrar * .dylib, verá * .tbd.

Qual é a razão para isto?

** Para pessoas que precisam de dylib, siga a partir desta postagem

  1. Escolha "Adicionar outro"
  2. Uma vez na janela de seleção de arquivo, faça "CMD" + Shift + G (Vá para a pasta) e digite / usr / lib /
  3. Em / user / lib, você pode encontrar os arquivos * .dylib
Ted
fonte
11
Tudo faz parte do "plano secreto" das maçãs ...
l'L'l
adicionando * .dylib de / usr / lib / Isso só funciona para mim ao executar meu aplicativo no simulador, mas não funciona com o dispositivo.
keshav vishwkarma

Respostas:

153

Procurei no Google, mas a única coisa que posso encontrar até agora é a seguinte citação dos fóruns de desenvolvedores da Apple :

Para quem tem curiosidade, os arquivos .tbd são novas "bibliotecas stub baseadas em texto", que fornecem uma versão muito mais compacta das bibliotecas stub para uso no SDK e ajudam a reduzir significativamente o tamanho do download.

Esperamos que mais documentação esteja disponível em breve.

Atualizar

Como exemplo, aqui está todo o conteúdo do libsqlite3.tbd . É apenas um arquivo de texto. Observe que o nome da instalação é 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 ]
...

Encontrei este e outros arquivos .tbd em

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

Você também pode ver um arquivo .tbd se for para a guia Geral do seu projeto Xcode e, em seguida, adicionar uma biblioteca em Frameworks e Bibliotecas Vinculadas. O arquivo .tbd será copiado para o seu projeto.

Portanto, parece que o arquivo .dylib é a biblioteca real de código binário que seu projeto está usando e está localizado no diretório / usr / lib / no dispositivo do usuário. O arquivo .tbd, por outro lado, é apenas um arquivo de texto incluído no seu projeto e serve como um link para o binário .dylib necessário. Como esse arquivo de texto é muito menor que a biblioteca binária, diminui o tamanho do download do SDK.

Neste ponto, estou apenas supondo as informações fornecidas, portanto, corrija-me se estiver errado.

Suragch
fonte
3
O formato do arquivo TBD é na verdade apenas um arquivo YAML. O vinculador apenas procura determinadas tags.
C0deH4cker 30/03
5
Por que diminui o tamanho do aplicativo? Ele simplesmente não vincula o dylib real de qualquer maneira no momento da compilação / link? Não estou dizendo que você está errado, apenas tentando entender
stonedauwg
3
Reduz o tamanho do SDK que você baixa com o Xcode, não o tamanho do aplicativo que você está criando.
joky
Obrigado, @Joky. Corrigi o erro na minha resposta. Você sabe em que momento os binários são adicionados ao aplicativo se eles não estão no SDK? E de onde eles vêm? Eles são baixados conforme necessário, dependendo de quais arquivos .tbd são usados?
Suragch
5
Os dylibs no SDK estão presentes no dispositivo quando o sistema operacional está instalado. Portanto, eles eram inúteis no SDK, mas para permitir que o vinculador faça seu trabalho quando você vincula o aplicativo (as bibliotecas dinâmicas não são copiadas no aplicativo e permanecem separadas). Portanto, a alteração nos arquivos tbd é remover o dylib, mantendo apenas a quantidade mínima de informações usada pelo vinculador e atualizando o vinculador para entender esse novo formato.
joky
22

.dylib é o binário compilado que contém o código da máquina. .tbd é um arquivo de texto menor, semelhante a um mapa de módulo de plataforma cruzada.

Peter Lapisu
fonte
8
Onde você aprendeu isso? Você tem algum link que eu possa pesquisar mais sobre isso?
Suragch 19/10/2015
2
basta olhar para o conteúdo de um .tds
Peter Lapisu
6
Um arquivo .tds é o mesmo que um arquivo .tdb? Onde eu encontraria esse arquivo para examinar seu conteúdo?
Suragch
7
É TBD, não TDS ou TDB. Representa a definição de dylib baseada em texto.
precisa saber é o seguinte
4

.tbd- Text Based dylib stubs. É um tipo de otimização que significa que você não precisa copiar um .dylibarquivo (que existe em um destino) em seu pacote (por exemplo, aplicativo). Este arquivo não contém o código binário que tem um grande impacto no tamanho do arquivo.

É aplicável apenas para:

  1. Dynamic libraries porque eles estão vinculados ao tempo de execução
  2. O arquivo deve ter um caminho relevante no destino. Como resultado, é o melhor lugar para standard system libraries.

Para o desenvolvimento do iOS, você pode encontrar arquivos .tbd que você pode usar aqui

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

Por exemplo, libiconv.tbdparece

insira a descrição da imagem aqui

Este arquivo contém algumas informações meta, como:

  • .dylib localização
  • símbolos (propriedades da classe, métodos)
  • arquitetura
  • plataforma
yoAlex5
fonte
1
não contém declarações de método. Somente os nomes das classes e os nomes das funções livres exportados da biblioteca.
Anton Kukoba