C++ 静态链接同一SQLite库的两个项目会导致问题

C++ 静态链接同一SQLite库的两个项目会导致问题,c++,c,sqlite,shared-libraries,static-libraries,C++,C,Sqlite,Shared Libraries,Static Libraries,我有个奇怪的问题 我正在使用C编写一个共享库,并在C++上编写了GUI应用程序。GUI应用程序使用共享库。此共享库静态使用SQLite合并和链接。GUI还使用SQLite进行一些配置。它也是静态链接的。它们都使用最新的SQLite版本 我的共享库使用FTS4。我通过在编译共享库时提供编译时选项启用了FTS4。所有这些都可以很好地与共享库配合使用。我在共享库代码库中的所有测试都通过了 当我开始在GUI程序中使用它时,问题就出现了。我得到的错误是,未知模块FTS4。这很奇怪,因为我在共享库中静态链接

我有个奇怪的问题

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

我的共享库使用
FTS4
。我通过在编译共享库时提供编译时选项启用了FTS4。所有这些都可以很好地与共享库配合使用。我在共享库代码库中的所有测试都通过了

当我开始在GUI程序中使用它时,问题就出现了。我得到的错误是,
未知模块FTS4
。这很奇怪,因为我在共享库中静态链接了它,而这个GUI程序所做的就是动态链接到我的库。当我将FTS编译选项设置到GUI程序时,错误消失了,并且一切正常

总之,

libfoo.so
-静态链接打开FTS4选项的SQLite
foo
-静态链接SQLIte,不带任何特殊的编译时选项。动态链接到
libfoo


我不知道为什么会这样。任何帮助都会很好

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

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

{
global:
  *;
local:
  sqlite3*;
};
将其放入名为
foo.map
的文件中,并在链接
libfoo.so
时(假设使用gcc)

gcc-Wl,--version script=foo.map-o libfoo.so

这可能会导致在
中使用内部符号。因此
而不是在主应用程序中定义的符号。

没有编译/链接器错误。它在运行时加载不正确版本的函数。它总是从
foo
加载SQLIte函数。谢谢。这是有道理的。我要试一试。所以我认为MSVC不会发生这种情况。因为MSVC不会导出所有函数。默认情况下,Windows不会从dll导出符号-您必须显式导出要使其可用的每个符号;此外,windows还将符号链接到库名称
gcc -Wl,--version-script=foo.map -o libfoo.so <dependent files>