Linux系统程序运行时加载动态库路径顺序
程序運行時加載動態庫路徑順序(Linux)
在linux系統中,如果程序需要加載動態庫,它會按照一定的順序(優先級)去查找:
鏈接時路徑(Link-time path)和運行時路徑(Run-time path)不是一回事,當然,當你知道這個概念的時候,你當然明白。
那么自制的庫在沒有指定運行時庫的路徑時,一般是不會找到你特定目錄的,先來說說鏈接庫的搜尋順尋:
1.編譯目標代碼時指定的動態庫搜索路徑(指的是用-wl,rpath或-R選項而不是-L);example: gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;(export LD_LIBRARY_PATH=/root/test/env/lib)3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;(更改/etc/ld.so.conf文件后記得一定要執行命令:ldconfig!該命令會將/etc/ld.so.conf文件中所有路徑下的庫載入內存中)4.默認的動態庫搜索路徑/lib;5.默認的動態庫搜索路徑/usr/lib。
在命令前加環境變量設置,該環境變量只對該命令有效,當該命令執行完成后,該環境變量就無效了。如下述命令:# LD_LIBRARY_PATH=/root/test/env/lib ./pos
下面對編譯時庫的查找與運行時庫的查找做一個簡單的比較:
1. 編譯時查找的是靜態庫或動態庫,而運行時,查找的只是動態庫。2. 編譯時可以用-L指定查找路徑,或者用環境變量LIBRARY_PATH,而運行時可以用-Wl,rpath或-R選項,或者修改/etc/ld.so.conf文件或者設置環境變量LD_LIBRARY_PATH.3. 編譯時用的鏈接器是ld,而運行時用的鏈接器是/lib/ld-linux.so.2.4. 編譯時與運行時都會查找默認路徑:/lib /usr/lib5. 編譯時還有一個默認路徑:/usr/local/lib,而運行時不會默認找查該路徑。
環境變量LIBRARY_PATH可以指定編譯時搜索動態庫的路徑;
環境變量LD_LIBRARY_PATH可以指定程序運行時動態庫搜索和加載的路徑;
cmake . -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_SYSTEM_NAME=Linux
根據cmake官方關于交叉編譯的介紹: 《Cross Compiling for Linux》,CMAKE_SYSTEM_NAME和CMAKE_SYSTEM_PROCESSOR是交叉編譯的時候必須指定的兩個參數。
所以如果在cmake命令行定義了CMAKE_SYSTEM_NAME,就必須也定義CMAKE_SYSTEM_PROCESSOR,如下。
cmake . -G "Eclipse CDT4 - Unix Makefiles" \-DCMAKE_SYSTEM_NAME=Linux \-DCMAKE_SYSTEM_PROCESSOR=x86_64
如果在命令行只是定義了CMAKE_SYSTEM_NAME,就會出現CMAKE_SYSTEM_PROCESSOR為空這種奇怪的問題。
另外經測試如果在CMakeLists.txt腳本中用set命令設置CMAKE_SYSTEM_NAME的值,并不會影響CMAKE_SYSTEM_PROCESSOR的值:
set(CMAKE_SYSTEM_NAME Linux)
總結
以上是生活随笔為你收集整理的Linux系统程序运行时加载动态库路径顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个带雨字的qq网名。
- 下一篇: 【error】error: field