【发布时间】:2014-09-24 10:07:40
【问题描述】:
我有一个 BB 10/QNX 应用程序,我需要在其中使用比 BB 10 上的默认版本更新的 SQLite。我想我可以通过将我自己的 SQLite 代码与我的应用程序链接来做到这一点。我意识到在我的 qmake 生成的 Makefile 中,选项 -lsqlite3 被传递给 qcc。在库位置(/opt/bbndk/target_10_2_0_1155/qnx6/armle-v7/usr/lib)我找到了以下文件:
size filename
559386 libsqlite3.a
560662 libsqlite3S.a
15 libsqlite3.so -> libsqlite3.so.1
496503 libsqlite3.so.1
我认为我可以用我自己的从最新的 sqlite3.c(合并)编译的文件替换 libsqlite3.a。让我感到困惑的是,我的应用程序可执行文件的大小仅为 180 kB,因此 libsqlite3.a 中的代码似乎不存在于其中。如果 SQLite 是动态链接的,我希望应用程序存档 (.bar) 包含 libsqlite3.so,这也不正确,因为存档只有 130 kB 大。应用程序怎么可能使用 SQLite(通过 Qt 数据库类),但 SQLite 代码从未进入应用程序存档?
【问题讨论】:
-
编译器将优化并忽略静态库中不需要/使用的东西,同时构建可执行文件。可执行文件不需要总是包含静态库中的所有代码。
-
是的,这就是
.a存档的全部想法。如果这个库做得很好并且真的被分成了非常小的编译单元,那么加载器真的只需要它在最终可执行文件中需要的东西。
标签: c makefile linker blackberry-10 qnx