2017-05-17 69 views
3

我使用包含libLLVM * .so文件和相應的libLLVM * .a文件的本地LLVM構建Julia。這是由BUILD_SHARED_LIBS=ON構建的,它負責libLLVM * .so文件的存在。鏈接器是否比.a文件更喜歡.so文件?

libjulia.so,由julia可執行程序使用的庫,總是與libLLVM *。所以文件,甚至當我重建LLVM與BUILD_SHARED_LIBS=OFF(默認配置)。 llvm-config --libs $LIB的輸出有和沒有BUILD_SHARED_LIBS=ON沒有太大的差異,似乎沒有什麼暗示llvm-config發出鏈接選項,指示鏈接器鏈接* .so文件或* .a文件。

爲什麼會出現這種情況?即使。。存在同名的文件,鏈接器的默認行爲是否使用.so文件?或者,是否有Julia重用的構建配置緩存?

回答

4

是,履行選項-lfoold將默認鏈接libfoo.so優先於libfoo.a如果兩個 在同一個搜索目錄中找到,並在找到任何一個它 將沒有進一步看。

只能通過傳遞-static的聯動, 但在這種情況下,靜態版本必須爲所有庫中找到執行靜態庫聯動 - 包括 默認的系統庫 - 不只是那些你明確提及。

要選擇鏈接靜態庫libfoo.a,而不指定-static, 可以使用-l選項的明確形式:-l:libfoo.a而非 -lfoo

llvm-config會散發出庫選項在-lfoo形式是否建立 靜態或共享庫,因爲這些選項可以正常工作了 下去,但你需要使用這些鏈接器如何 的行爲時,理解。如果你沒有告訴它,它會鏈接共享,而不是靜態庫時,它面臨的選擇 。

後來

爲什麼LD喜歡共享庫在靜態的鏈接?

據我所知,它不記錄爲何ld開發商長期 前做出這個決定,但原因是顯而易見的:如果動態鏈接是默認然後 可執行文件,默認情況下,不會實際包括其他副本代碼 可以通過共享庫從單個共享副本提供給所有可執行文件。因此, 可執行文件在默認情況下將節省其代碼大小,構成您系統或我的系統的可執行文件的總和將遠遠小於它必須不共享的 。共享庫和動態鏈接 被髮明出來,因此係統不需要被重複代碼臃腫。

動態鏈接帶來了與共享庫鏈接的可執行文件,當它被分發到系統之外的其他系統時,並不是它的動態依賴關係的複雜性。這是 出於這個原因,所有的系統上安裝新的二進制文件 批准的機制 - 包管理器 - 確保所有的動態依賴 的安裝爲好。

+0

感謝您的回答!爲什麼'ld'喜歡共享庫在靜態的鏈接? – kesari

+0

@kesari更新答案 –