【问题标题】:Multiple SQLite libraries on a single process单个进程上的多个 SQLite 库
【发布时间】:2017-04-27 10:13:09
【问题描述】:

操作系统:基于 arm 的 Linux。

编程语言:C、C++

编译器:arm gcc

我们构建了一个共享库(我们称之为 libFoo.so),它依赖于某个 SQLite 版本。 SQLite 库是静态编译的,并与 libFoo.so 链接。它们都以隐藏可见性 (-fvisibility=hidden) 编译,并且 libFoo.so 仅导出其 API 符号,因此使用“nm -D libFoo.so”看不到 SQLite 符号。这是为了避免符号冲突。 这个共享库只对一组特定的数据库文件执行读操作。这些数据库预计只能通过 libFoo.so 打开。

我们的合作伙伴使用 libFoo.so 构建应用程序,并从平台链接到 Qt 服务框架。 Qt 服务框架依赖于平台上的 SQLite 共享库,它的版本与我的不同。这意味着这个过程会加载两个 SQLite 库副本,但来自 libFoo.so 的那个是隐藏的。

问题:

  1. 我最终会遇到How to corrupt - Multiple copies of SQLite linked into the same application 中提到的数据库损坏问题的可能性有多大?我很好奇它可能出错的情况。

  2. SQLite 保留一个打开的 SQLite 数据库文件的全局列表。 SQLite 共享库是否有机会从 SQLite 静态库访问打开的数据库文件的全局列表?

在上面的 SQLite 页面中,提到了一个解决方案,它只链接一个 SQLite 库的副本,这意味着更改我无法访问的平台的构建过程。

我搜索了一下,发现了一个有趣的讨论:

谢谢!

【问题讨论】:

    标签: c++ sqlite


    【解决方案1】:

    我在将代码编译到苹果 ios 时遇到了这个问题。另一个使用另一个版本的 sqlite3 的 sdk 库。

    我只是在我的 sqlite3 源代码和我的 sqlite3 源代码的调用者中将字符串 sqlite3 重命名为另一个随机字符串(例如 hrbw)。

    那么问题就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 2014-07-05
      • 1970-01-01
      相关资源
      最近更新 更多