gpt4 book ai didi

c++ - 静态链接相同 SQLite 库的两个项目会导致问题

转载 作者:行者123 更新时间:2023-11-28 08:00:02 25 4
gpt4 key购买 nike

我有一个奇怪的问题。

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

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

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

简而言之,

libfoo.so - 在启用 FTS4 选项的情况下静态链接 SQLitefoo - 静态链接 SQLIte,没有任何特殊的编译时选项。动态链接到 libfoo

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

最佳答案

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

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

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

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

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

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

关于c++ - 静态链接相同 SQLite 库的两个项目会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11716321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com