在Linux上静态链接库

时间:2010-12-28 13:34:01

标签: c++ linux gcc linker sqlite

我正在尝试为Firefox 3.6制作XPCOM组件。*。它使用libsqlite3版本3.7.4静态编译(带程序无关代码生成 - -fPIC编译器选项)。我面临的问题是,一旦Firefox加载组件并开始执行,sqlite3_libversion_number()返回3007001,而宏SQLITE_LIBVERSION_NUMBER定义为3007004.我很确定我正在链接正确的静态sqlite3库...但我怎么能仔细检查这个?生成的共享对象的ldd输出不会将libsqlite3.so列为依赖项(尽管用于创建XPCOM组件的libxul.so使用libsqlite3.so)。如何将所有sqlite3函数调用解析为不同版本的SQLite?

PS:是因为库是用-fPIC编译的,后来Firefox使用dlopen加载它们?

2 个答案:

答案 0 :(得分:0)

我正在查看包含顺序。我花了一整天或类似的事情想知道为什么fseek()失败了,不是直接在Linux上而是在Bada上,并且使用Eclipse IDE。问题是,具有相同签名的相同功能是由Bada SDK的一些“beta”阶段.a文件导出的。我首先偶然输入了错误的.a文件。

答案 1 :(得分:0)

在linux中,它将执行递归符号解析 - 即如果libxul使用libsqlite3,则firefox将通过包含libxul中的libsqlite3来间接解析符号。

在AIX机器中不是这种情况 - 不会进行递归符号解析(基于依赖库)。

这可能不是实际问题 - 但值得检查。

同时检查sqlite3是否向后兼容(我认为是),然后你可以将libxul和其他库链接到最新版本的sqlite3。