怎么卸載make install安裝的軟件?
https://www.zhihu.com/question/20092756
怎么指定安裝目錄以及對應的添加動態庫的方法
linux庫在不指定安裝路徑時:如:make install ,庫將安裝於默認安裝路徑,即為根目錄下的 /usr/local/inlcude/對應庫的庫文件夾/對應庫的頭文件 和 /usr/local/lib/對應庫 ,在安裝好庫之后,還是不能直接調用的,原因是 :(以下為轉載內容)
error while loading shared libraries: xxx.so.x"錯誤的原因和解決辦法 2012-06-28 10:05:06
分類: LINUX
一般我們在Linux下執行某些外部程序的時候可能會提示找不到共享庫的錯誤, 比如:
tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory
原因一般有兩個, 一個是操作系統里確實沒有包含該共享庫(lib*.so.*文件)或者共享庫版本不對, 遇到這種情況那就去網上下載並安裝上即可.
另外一個原因就是已經安裝了該共享庫, 但執行需要調用該共享庫的程序的時候, 程序按照默認共享庫路徑找不到該共享庫文件.
所以安裝共享庫后要注意共享庫路徑設置問題, 如下:
1) 如果共享庫文件安裝到了/lib或/usr/lib目錄下, 那么需執行一下ldconfig命令
ldconfig命令的用途, 主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下, 搜索出可共享的動態鏈接庫(格式如lib*.so*), 進而創建出動態裝入程序(ld.so)所需的連接和緩存文件. 緩存文件默認為/etc/ld.so.cache, 此文件保存已排好序的動態鏈接庫名字列表.
2) 如果共享庫文件安裝到了/usr/local/lib(很多開源的共享庫都會安裝到該目錄下)或其它"非/lib或/usr/lib"目錄下, 那么在執行ldconfig命令前, 還要把新共享庫目錄加入到共享庫配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
3) 如果共享庫文件安裝到了其它"非/lib或/usr/lib" 目錄下, 但是又不想在/etc/ld.so.conf中加路徑(或者是沒有權限加路徑). 那可以export一個全局變量LD_LIBRARY_PATH, 然后運行程序的時候就會去這個目錄中找共享庫.
LD_LIBRARY_PATH的意思是告訴loader在哪些目錄中可以找到共享庫. 可以設置多個搜索目錄, 這些目錄之間用冒號分隔開. 比如安裝了一個mysql到/usr/local/mysql目錄下, 其中有一大堆庫文件在/usr/local/mysql/lib下面, 則可以在.bashrc或.bash_profile或shell里加入以下語句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
一般來講這只是一種臨時的解決方案, 在沒有權限或臨時需要的時候使用.
4)如果程序需要的庫文件比系統目前存在的村文件版本低,可以做一個鏈接
比如:
error while loading shared libraries: libncurses.so.4: cannot open shared
object file: No such file or directory
ls /usr/lib/libncu*
/usr/lib/libncurses.a /usr/lib/libncurses.so.5
/usr/lib/libncurses.so /usr/lib/libncurses.so.5.3
可見雖然沒有libncurses.so.4,但有libncurses.so.5,是可以向下兼容的
建一個鏈接就好了
ln -s /usr/lib/libncurses.so.5.3 /usr/lib/libncurses.so.4
運行以下ldconfig更新下共享庫就可以了。
怎么添加動態庫
vi /etc/ld.so.conf
分別添加了兩個路徑,每個路徑占一行。編輯完后,重新加載庫:
/sbin/ldconfig -v
命令ldconfig -v |grep "庫名" 查看系統是否有加載該庫
緩存文件默認是/etc/ld.so.cache,此文件保存已經排好序的動態鏈接庫名字列表。
總結:
1. 往/lib和/usr/lib里面加東西,是不用修改/etc/ld.so.conf的,但是完了之后要調一下ldconfig,不然這個library會找不到
2. 想往上面兩個目錄以外加東西的時候,一定要修改/etc/ld.so.conf,然后再調用ldconfig,不然也會找不到。比如安裝了一個到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,這時就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存過后ldconfig一下,新的library才能在程序運行時被找到。
3. 如果想在這兩個目錄以外放lib,但是又不想在/etc/ld.so.conf中加東西(或者是沒有權限加東西)。那也可以,就是export一個全局變量LD_LIBRARY_PATH,然后運行程序的時候就會去這個目錄中找library。一般來講這只是一種臨時的解決方案,在沒有權限或臨時需要的時候使用。
4. ldconfig做的這些東西都與運行程序時有關,跟編譯時一點關系都沒有。編譯的時候還是該加-L就得加,不要混淆了。
5. 總之,就是不管做了什么關於library的變動后,最好都ldconfig一下(更新動態緩存庫)
6. ldconfig -p 命令可以查看每個動態庫的路徑
指定運行時動態庫位置的三種方式
在Linux 中,動態庫的搜索路徑除了默認的搜索路徑外,還可通過三種方法來指定:方法一:在配置文件/etc/ld.so.conf中指定動態庫搜索路徑;方法二:通過環境變量LD_LIBRARY_PATH指定動態庫搜索路徑;方法三:在編譯目標代碼時指定該程序的動態庫搜索路徑。
Linux動態庫的默認搜索路徑是/lib和/usr/lib。動態庫被創建后,一般都復制到這兩個目錄中。當程序執行時需要某動態庫,並且該動 態庫還未加載到內存中,則系統會自動到這兩個默認搜索路徑中去查找相應的動態庫文件,然后加載該文件到內存中,這樣程序就可以使用該動態庫中的函數,以及該動態庫的其它資源了。
通過配置文件
修改/etc/ld.so.conf文件。
其文件內容為:
[root@VM_24_16_centos etc]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
[root@VM_24_16_centos etc]#
所以,可以在文件夾/etc/ld.so.conf.d/中添加自己的文件,例如:創建文件gx.conf,
然后在文件中添加動態庫路徑,例如:
/root/code/opencv/opencv-3.2.0/build/build/lib
注意,保存退出之后需要執行命令ldconfig刷新當前緩存。
通過gcc參數指定
-Wl,-rpath=${LD_PATH} #-Wl,-rpath=<動態庫所在路徑>
g++ ${RPATH} ./opencv_knn.cpp -o knn
通過設置環境變量
只對當前shell有效,關閉shell或者退出當前用戶則環境變量配置及無效了。
export LD_LIBRARY_PATH=/root/code/opencv/opencv-3.2.0/build/build/lib
#LD_LIBRARY_PATH=<動態庫所在位置>
---------------------
作者:土戈
來源:CSDN
原文:https://blog.csdn.net/f110300641/article/details/82657972
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!