2012-11-02 21 views
2

如果我的術語不正確,我會提前道歉。如果應用程序鏈接到共享庫,那麼爲什麼編譯時需要該庫?

比方說,我有一個名爲libVectorMath.so的共享庫。它有兩個有趣的功能,addVector()subtractVector()。這兩個功能在vectorMath.h原型。我還有一個名爲testVectorMath的可執行文件,它使用這兩個函數,並動態鏈接到libVectorMath.so

一般來說,要構建testVectorMath,我還需要構建libVectorMath.so。爲什麼是這樣?頭文件vectorMath.h不足以告知testVectorMath它應該期望在libVectorMath.so中找到哪些符號?

換句話說,不能testVectorMath有它的一些指令說「尋找一個庫調用libVectorMath.so然後查找名爲內它addVector()subtractVector()符號」?

+1

看看這裏的熱門答案http://stackoverflow.com/questions/3159395/why-symbols-of-a-shared-library-are-not-resolved-at-link-time –

+0

你怎麼樣告訴你的可執行文件* where *以查找在vectorMath.h中聲明的函數? –

回答

0

閱讀本文link。它以一種非常好的方式講述了相同的情況!

以上摘錄如下: 所有共享庫方案的工作方式基本相同。在鏈接時,鏈接器像平常一樣搜索庫以查找解決其他未定義的外部符號的模塊。但不是將模塊的內容複製到輸出文件中,鏈接器會記下模塊來自哪個庫,並將這些庫的列表放在可執行文件中。加載程序時,啓動代碼會在程序啓動之前查找這些庫並將它們映射到程序的地址空間中,如圖1所示。標準操作系統文件映射語義自動共享映射爲只讀或寫入時複製的頁面。執行映射的啓動代碼可能位於操作系統,可執行文件,映射到進程地址空間的特殊動態鏈接程序中,或三者的某種組合。

相關問題