linux下動態庫靜態庫鏈結路徑設定問題

2022-10-14 21:15:07 字數 828 閱讀 2034

g++/gcc 連線 so動態庫或者 .a靜態庫時,需要設定這些動態庫的路徑, 例如:

g++ -o main -l./lib -ldymamic -lpthread -lrt 這些是設定到哪個目錄下去查詢關聯的動態庫。 如果在-l目錄下面找不到相應的動態庫,就會到 ld_library_path 的目錄下去找,如果還找不到,就會到/usr/lib 目錄下去找。

而如果要關聯靜態庫,例如: g++ -o main -l./lib -ldymamic .

/lib/ 。 請注意這個靜態庫的路徑。 對於靜態庫,是需要詳細標明這個靜態庫的路徑的, 因為-l後面設定的路徑,對於靜態庫來說是無效的。

現在談另外乙個問題:

g++ -o main -l./lib -ldymamic -lpthread -lrt 編譯成功後, ./main 執行程式會報錯, 提示找不到 動態庫。

 因為使用這種方式,需要額外的設定:

export ld_library_path=$ld_library_path:./lib ,之後執行main就可以正常執行了。

當然,你也可以直接這樣寫:

g++ -o main /home/****/ -lpthread -lrt , 直接寫動態庫的絕對路徑。 這樣就不需要設定ld_library_path。 但這樣有乙個缺陷:

這個so必須放在絕對路徑下,不能放到其他地方。 這種寫法很不好,不提倡。

動態庫搜尋路徑分兩種,一種是鏈結時候的搜尋路徑,一種是執行時期的搜尋路徑。像前面提到的-l./lib是屬於鏈結時期的搜尋路徑,即給ld程式提供的編譯鏈結時候尋找動態庫路徑;而ld_library_path則既屬於鏈結期搜尋路徑,又屬於執行時期的搜尋路徑。

靜態鏈結庫與動態鏈結庫區別

動態鏈結庫 dll不必被包含在最終的exe中,exe檔案執行時可以動態地引用和解除安裝dll檔案。同時,靜態鏈結庫中不能再包含其他的動態鏈結庫或靜態庫,而動態鏈結庫中可以包含其他的動態或靜態庫。vc 支援的dll dll的編制與具體的程式語言及編譯器無關,動態鏈結庫隨處可見,vc 支援三種dll 非...

動態鏈結庫dll學習總結

1.什麼是lib檔案,lib和dll的關係如何 1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式...

第十四章動態鏈結庫

第十四章動態鏈結庫 visual c 6.0 程式設計例項與技巧 一建立s14 dll 1 這個擴充套件mfc extension dll 向應用程式提供的功能有 1 建立工程 2 設計共享資料 pragma data seg myshareddata 宣告乙個共享資料段用於程序使用dll的記數 i...