我有一个BB 10 / QNX应用程序,我需要使用更新版本的SQLite而不是BB 10上的默认版本。我想我可以通过将我自己的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
我认为我可以将libsqlite3.a替换为我自己从最新的sqlite3.c(amalgamation)编译的文件。让我感到困惑的是,我的应用程序可执行文件的大小只有180 kB,所以libsqlite3.a中的代码似乎并不存在。如果SQLite是动态链接的,我希望应用程序存档(.bar)包含libsqlite3.so,这也不是真的,因为存档只有130 kB。应用程序如何使用SQLite(通过Qt数据库类),但SQLite代码永远不会进入应用程序存档?
答案 0 :(得分:0)
静态版
将可执行文件链接到静态库时,编译器知道您正在构建“已完成的产品”:任何内容都不依赖于您的可执行文件。它允许编译器不包含未使用的代码。假设你只使用了库中的一个函数,它本身没有使用库中的任何其他函数。编译器将仅选择与此特定功能相对应的机器代码,并轻轻忽略其余部分。
动态版
关于bar存档和动态库的大小,它归结为真正的bar存档。它只是一个zip存档(可能添加了一些元数据,但不详细了解)。两种可能性:.so文件被大大压缩,或者编译器依赖于系统库,而不是将其捆绑在bar存档中。