如何同時同時使用動態和靜態庫連接,在GCC指令參數中具體參數以下:
-Wl,-Bstatic -L/usr/local/sqlite-arm-linux/.libs -lsqlite -Wl,-Bdynamic -L/usr/local/arm/3.3.2/lib
具體用途解釋:sqlite庫靜態鏈接,其它庫動態鏈接。
-Wl,-Bstatic 與-Wl,-Bdynamic參數,從字面意義上能夠理解,有靜態和動態的意思,可是具體的真正規則在查找了GCC的原版手冊上有說明。
原文:
Note - if the linker is being invoked indirectly, via a compiler driver (eg gcc) then all the linker command line options should be prefixed by -Wl, (or whatever is appropriate for the particular compiler driver) like this:
gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup
This is important, because otherwise the compiler driver program may silently drop the linker options, resulting in a bad link.
實際上主要針對隱式應用LINKER的參數,用「-Wl,」來標識,,「--startgroup foo.o bar.o -Wl,--endgroup」表示一組,,-Bstatic -Bdynamic 做爲關鍵字與-WL,不可分,在GCC鏈接庫時,默認連接是動態連接,如今用上面的指令限制在連接sqlite庫時採用靜態連接。
-Bstatic 還有三個寫法: -dn和-non_shared 和-static
-Bdynamic 還有兩個寫法:-dy 和-call_shared linux
上面參數「-L/usr/local/sqlite-arm-linux/.libs 」放不放在-Wl,...之間無所謂,由於它只是提供了sqlite動靜態庫的位置。能夠改爲下面的參數形式,更直觀。
-L/usr/local/sqlite-arm-linux/.libs -L/usr/local/arm/3.3.2/lib -Wl,-dn -lsqlite -Wl,-dy
-Wl,-dn 和 -Wl,-dy成對出現才能起到標題所說的做用。
關於-Wl,後面的參數還有不少,所有明白我也不能。 sql
還有一個問題值得注意,在-Wl,後面不能有空格,不然會出錯! 關於-Wl,option 說明還有一段說明 GCC命令參數的英文原文 -Wl,option Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. 傳遞參數option做爲linker的一個參數,若是option包含逗號,將在逗號處分割成幾個參數。 例如: -Wl,-dn –lsqlite -dn 開始靜態連接 -lsqlite 靜態連接sqlite庫 靜態連接完後,而後須要動態連接 -Wl,-dy 從新開始動態連接。