2014-09-24 82 views
0

我有一个BB 10/QNX应用程序,我需要使用比BB 10上的默认版本更新版本的SQLite。我想我可以通过将我自己的SQLite代码与我的应用程序。我意识到在我的qmake生成的Makefile中,选项-lsqlite3被传递给qcc。在库的位置(/选择/ 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(合并)。令我困惑的是,我的应用程序可执行文件的大小仅为180 kB,因此libsqlite3.a中的代码似乎不在其中。如果SQLite是动态链接的,我希望应用程序归档(.bar)包含libsqlite3.so,这也不是真的,因为归档只有130 kB大。应用程序如何使用SQLite(通过Qt数据库类),但SQLite代码永远不会将它应用于应用程序存档?

+3

编译器将在构建可执行文件时优化并省略静态库中不需要/使用的内容。可执行文件不必总是拥有来自静态库的所有代码。 – Rohan 2014-09-24 10:13:29

+0

是的,这是'.a'档案的整个想法。如果库做得很好,并且已经分配到非常小的编译单元,那么加载程序确实只会在最终的可执行文件中使用它所需要的。 – 2014-09-24 12:38:08

回答

0

静态版本

当链接可执行文件到一个静态库,编译器知道你正在构建一个“成品”:什么将取决于你的可执行文件。它允许编译器而不是包含未使用的代码。假设您只使用库中的一个函数,而函数库本身并未使用库中的任何其他函数。编译器将只选择与此特定功能相对应的机器代码,然后轻轻忽略其余部分。

动态版

关于巴归档文件的大小和动态库,它的股价下跌到什么真的是棒存档。它只是一个zip压缩文件(可能添加了一些元数据,不知道详情)。两种可能性:.so文件被大大压缩,或者编译器依赖于系统库,而不会将其捆绑到条形文档中。

相关问题