OS:基于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的那个被隐藏。
问题:
我最终可能会遇到How to corrupt - Multiple copies of SQLite linked into the same application中提到的数据库损坏问题?我对可能出错的情况感到好奇。
SQLite保留了打开的SQLite数据库文件的全局列表。 SQLite共享库是否有可能从SQLite静态库访问开放数据库文件的全局列表?
在上面的SQLite页面中,提到了一个仅针对SQLite库的一个副本链接的解决方案,这意味着要更改我无法访问的平台的构建过程。
我用Google搜索并发现了一个有趣的讨论:
谢谢!
答案 0 :(得分:0)
当我将代码编译到Apple ios时遇到了这个问题。使用另一个版本的sqlite3的另一个sdk库。
我只是将sqlite3源代码和sqlite3源代码的调用者中的字符串sqlite3重命名为另一个随机字符串(例如hrbw)。
然后问题将得到解决。