2014-09-24 79 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文件被大大壓縮,或者編譯器依賴於系統庫,而不會將其捆綁到條形文檔中。

相關問題