Linux下c++動態庫鏈接的流程設計解釋

http://www.cnblogs.com/skynet/p/3372855.html

這是參考的博客,講的挺詳細的

然後我又看了關於動態庫,靜態庫的其他內容博客,懂了編譯的大部分流程和原理,但是有一個疑惑沒有想明白

 

g++ -L(動態庫所在路徑)  -l(編譯所需的動態庫名稱) main.cpp -o demo 

 

編譯好後還需要把剛剛編譯時的路徑寫到系統運行時加載動態庫的路徑裏

 

看到這樣的編譯時

我會想編譯的時候二進制文件已經知道了需要調用的函數在(二進制)動態庫內部的相對位置

也就是說已經加載完動態庫文件,已經知道去哪裏加載動態庫文件,即通過-L已經知道動態庫路徑在哪裏了

 

 

那爲什麼等到程序運行時還要讓編譯好的二進制文件不知道動態庫的路徑在哪裏,明明編譯時可以記下來,也就是記錄到編譯好的

二進制文件裏,爲什麼g++的設計者要忘掉之前得到的變量,這不是很奇怪嗎?爲什麼要繞個遠路再去其他地方(Linux系統會加載的路徑,比如/usr/lib /lib 或者 /etc/ld.so.cache)找需要的動態庫

 

 

和幾個同學討論了完我終於想明白了

如果不把路徑忘記,那就只能把路徑寫進可執行二進制文件裏,那麼如果我更改了動態庫的絕對位置,那麼這個程序就一定運行不了了,g++設計者爲了避免這種(開發中幾乎一定會發生的)情況發生才特意如此設計,

因爲通常我們開發一個工程軟件,在工程文件夾裏寫完函數庫,製作完動態庫(此時在工程文件夾,現在就移動到系統第三方庫裏還要刪來刪去,需要權限太麻煩),運行,調試後覺得沒問題纔會開始把動態庫放到系統專門防止第三方動態庫的路徑裏,也就是說我們幾乎一定會在製作可執行文件後移動動態庫,所以往往第一次(-L)提到的路徑和第二次所需的路徑是不一樣的,所以需要寫下兩次路徑,g++設計者是從開發流程想才這麼設計的

 

 

以上均爲個人猜想(因爲感覺翻遍了中文的博客也找不到說這個問題的)

 

如果覺得有道理點個贊~~~~~~~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章