【问题标题】:Why dulplicate symbol errors do not occur when linking both libsqlite3.dylib and libsqlcipher.a?为什么链接 libsqlite3.dylib 和 libsqlcipher.a 时不会出现重复符号错误?
【发布时间】:2016-04-12 01:15:17
【问题描述】:

我正在根据本教程将 sqlcipher 集成到 iOS 项目中:https://www.zetetic.net/sqlcipher/ios-tutorial/ 有一个热门提示说:如果 libsqlite3.dylib 或其他 SQLite 框架列在您的 Link Binary With Libraries 列表中,请务必将其删除,否则您会看到重复的符号错误。
但是我尝试将 libsqlite3.tbd(xcode 7 中没有 dylib)和 libsqlcipher.a 添加到 Link Binary With Libraries,不会发生重复符号错误!为什么?
我注意到如果我单击#import <sqlite3.h> 行,xcode 会在 xcode 的 lib 文件夹中显示 sqlite3.h 文件,而不是 sqlcipher 中的那个。 但是,sqlcipher 确实有效,数据库确实是加密的。

【问题讨论】:

    标签: ios sqlite sqlcipher


    【解决方案1】:

    libsqlite3.tbd 只是一个文本文件,它定义了库支持的平台架构、目标平台、dylib 安装路径和导出的符号。使用.tbd 文件,您可以减小捆绑应用程序的大小,因为库二进制文件已经包含在平台设备中,因此不需要将其链接到您的应用程序映像中。

    libsqlite3.tbd 看起来像这样:

    ---
    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 ]
    ...
    

    您不会收到重复符号链接器错误,因为您只包含一个二进制库 libsqlcipher.a。如果您希望在 iOS 应用程序中使用 SQLCipher,则需要删除 libsqlite3.tbd 引用并包含 libsqlcipher.a

    【讨论】:

    • 非常感谢!但是我又做了一个实验……我从 www.sqlite.org 下载了 sqlite 源代码,并将 sqlite3.h sqlite3.c 添加到 proejct 中。仍然没有出现重复符号错误...
    • 你确定你正确链接了 libsqlcipher.a 吗?
    • 是的。 libsqlcipher.a 是 Link Binary With Libraries 中唯一添加的一个。我用 hexdump 检查创建的 sqlite 数据库文件,它确实是加密的。
    • 我觉得sqlcipher没什么问题,只是好奇这个问题。我还尝试了其他组合:libsqlite3.0.dylib 与 sqlite3 源文件,wxSQLite3 与 sqlite3 源文件,libsqlite3.0.dylib 与 wxSQLite3,错误只是没有发生。很多相关教程也提到不要把xxx和yyy加在一起,否则可能会出现重复符号错误。但是,错误只是没有发生......
    【解决方案2】:

    我遇到了同样的问题,如果不移除libsqlite3.0.tbd,加密取决于ios系统,iOS 13及更高版本,使用系统算法加密,iOS 12及更早版本,数据库不会被加密。

    您没有收到重复符号错误,因为系统 sqlite 是动态库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-17
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2016-07-21
      相关资源
      最近更新 更多