我有一个奇怪的问题。
我正在使用C语言编写的共享库和使用C ++编写的GUI应用程序。 GUI应用程序使用共享库。此共享库使用SQLite合并和静态链接。 GUI还使用SQLite进行某些配置。它也是静态联系的。它们都使用最新的SQLite版本。
我的共享库使用FTS4
。我通过在编译共享库时提供编译时选项来启用FTS4。一切都适用于共享库。我在共享库代码库中的所有测试都在通过。
当我在GUI程序中开始使用它时会出现问题。我收到的错误是Unknown module FTS4
。这很奇怪,因为我在我的共享库中静态链接,所有这个GUI程序都是动态链接到我的库。当我将FTS编译选项设置为GUI程序时,错误就会消失,一切正常。
简而言之,
libfoo.so
- 静态链接SQLite和启用的FTS4选项
foo
- 将SQLIte静态链接到任何特殊的编译时选项。动态链接到libfoo
。
我不确定为什么会这样。任何帮助都会很棒!
答案 0 :(得分:1)
听起来好像正在导出共享库中的所有sqlite函数。因此,当您加载共享对象时,所有这些函数都会被解析为主应用程序,主应用程序也定义了符号名称的相同副本,但具有不同的功能。
使用类似以下内容的地图文件编译共享对象可能会更好:
{
global:
*;
local:
sqlite3*;
};
将其放入名为foo.map
的文件中,并在链接libfoo.so
时(假设使用gcc)
gcc -Wl,--version-script=foo.map -o libfoo.so <dependent files>
这应该会导致在.so
内使用内部符号而不是主应用程序中定义的内部符号。