0

我有一个奇怪的问题。 

我正在开发一个使用 C 编写的共享库和一个用 C++ 编写的 GUI 应用程序。GUI 应用程序使用共享库。这个共享库使用 SQLite 合并和静态链接。GUI 也将 SQLite 用于某些配置目的。它也是静态链接的。他们都使用最新的 SQLite 版本。 

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

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

简而言之,

libfoo.so- 静态链接 SQLite 与 FTS4 选项打开 - 静态链接 SQLite foo没有任何特殊的编译时选项。动态链接到libfoo.

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

4

1 回答 1

1

听起来共享库中的所有 sqlite 函数都被导出了。结果,当您加载共享对象时,所有这些函数都被解析到主应用程序,它还定义了符号名称的相同副本,但具有不同的功能。

使用如下所示的映射文件编译共享对象可能会更好:

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

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

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

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

于 2012-07-30T08:16:56.967 回答