连接相同SQLite库的两个项目会导致问题

时间:2012-07-30 06:25:30

标签: c++ c sqlite shared-libraries static-libraries

我有一个奇怪的问题。

我正在使用C语言编写的共享库和使用C ++编写的GUI应用程序。 GUI应用程序使用共享库。此共享库使用SQLite合并和静态链接。 GUI还使用SQLite进行某些配置。它也是静态联系的。它们都使用最新的SQLite版本。

我的共享库使用FTS4。我通过在编译共享库时提供编译时选项来启用FTS4。一切都适用于共享库。我在共享库代码库中的所有测试都在通过。

当我在GUI程序中开始使用它时会出现问题。我收到的错误是Unknown module FTS4。这很奇怪,因为我在我的共享库中静态链接,所有这个GUI程序都是动态链接到我的库。当我将FTS编译选项设置为GUI程序时,错误就会消失,一切正常。

简而言之,

libfoo.so - 静态链接SQLite和启用的FTS4选项 foo - 将SQLIte静态链接到任何特殊的编译时选项。动态链接到libfoo

我不确定为什么会这样。任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

听起来好像正在导出共享库中的所有sqlite函数。因此,当您加载共享对象时,所有这些函数都会被解析为主应用程序,主应用程序也定义了符号名称的相同副本,但具有不同的功能。

使用类似以下内容的地图文件编译共享对象可能会更好:

{
global:
  *;
local:
  sqlite3*;
};

将其放入名为foo.map的文件中,并在链接libfoo.so时(假设使用gcc)

gcc -Wl,--version-script=foo.map -o libfoo.so <dependent files>

这应该会导致在.so内使用内部符号而不是主应用程序中定义的内部符号。