linux庫鏈接庫
linux下的mysql,一般提供2個庫:libmysqlclient.so 和 libmysqlclient_r.so
其中ibmysqlclient_r.so 是 libmysqlclient.so 的多線程安全版本
因為安裝時系統環境和指定的路徑可能不同,這2個庫的路徑可能在以下4個目錄內
/usr/lib/mysql/
/usr/lib64/mysql
/usr/lib/
/usr/lib64/
『貳』 怎麼條用linux中動態鏈接庫裡面的函數
在dlopen()函數以指定模式打開指定的動態鏈接庫文件,並返回一個句柄給dlsym()的調用進程。使用dlclose()來卸載打開的庫。
當庫被裝入後,可以把
dlopen()
返回的句柄作為給
dlsym()
的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,並且調用裝載庫中的相應函數。
『叄』 linux 怎麼指定靜態鏈接靜態庫
創建靜態庫: ar -rcs test.a *.o 查看靜態庫: ar -tv test.a 解壓靜態庫: ar -x test.a 查看程序依賴的動態庫: readelf -a xxx|grep library 如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。 rebi@ubuntu:~/test$ arm-none-li...
『肆』 在Linux上用命令怎麼連接資料庫(linux連接oracle資料庫命令)
以常見的mysql和oracle這兩種資料庫為例:
一、連接mysql(mysql服務已開啟)
1、mysql資料庫安裝在本機,則直接敲入命令mysql-uroot-p即可。
2、mysql資料庫不是安裝在本機,則需要加參數,常用參數如下:
1),-h,指定目標ip地址
2),-u,指定登錄用戶名。
3),-p,指定密碼,密碼可以接在-p後面輸入mysql-uroot-p123456。也可以mysql-uroot-p回車等提示輸入密碼時輸入,這樣輸入密碼沒有回顯。
二、連接oracle資料庫
1、若當前用戶為root用戶,則需要執行命令su-oracle切換至oracle用戶;若當前用戶為oracle用戶則此步驟省略。
2、若oracle安裝在本機,則在oracle用戶下直接執行sqlplususername/password(username,password替換成真實的用戶名和密碼)數喊,若提示connected則表示連接成功;
3、若oracle安裝在其他機器,則在oracle用戶下執行sqlplususername/password@//host:port/sid。host為oracle所在機器的ip或者機器名,port為埠號,通常為1521,sid指oracle的實例名。
(4)linux庫鏈接庫擴展閱讀:
linux下操作資料庫(以mysql為例)的其他命令
一、linux下查穗舉看mysql服務的命令兩種方式:
1、[root@localhostbin]ps-ef|grepmysql
2、[root@localhostbin]netstat-nlp
二、linux下啟動mysql服務的兩薯族野種方式:
1、命令方式:
[root@localhostbin]cd/usr/bin
[root@localhostbin]./mysqld_safe&
2、服務方式:
[root@localhost~]servicemysqlstart
如果服務在啟動狀態,直接重啟服務用以下命令:[root@localhost~]servicemysqlrestart
三、linux下關閉mysql服務的兩種方式:
1、命令方式:
[root@localhost~]mysqladmin-urootshutdown
2、服務方式:
[root@localhost~]servicemysqlstop
『伍』 linux下怎麼連接mysql資料庫(linux連接資料庫)
1、首先確保linux下mysql安裝好,服務啟動完之後,就叢巧激寬悔可以開始連接資料庫了。在終端輸入「mysql-hlocalhost-uroot-p」,其中h參數是主機名,這里是本地就寫localhost,也可以省略:
2、輸入mysql的密碼之後就登錄了,也可以不輸入密碼登錄,比如這里的root密碼是mysql123456,可以直接輸入「mysql-hlocalhost-uroot-」,此時就沒有提示輸入密碼,直接進入mysql的命令行中了:
3、此時顯示的就是mysql的命令行界面了,若滲襪要退出輸入quit就可以退出了。以上就是linux中連接資料庫的操作:
『陸』 面試 | Linux 下的動態鏈接庫問題
在 Linux 開發時,我們經常會看到一些形如 xxx.so 的名稱出現,其中 so 是 Shared Object 的縮寫,即可以共享的目標文件,也就是我們所稱為的動態鏈接庫,和在 Windows 下大家玩 游戲 時遇到的 xxx.dll 錯誤中的文件是一個類型的。
面試中經常會問到以下問題:
庫是寫好的現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行代碼的二進制形式,可以被操作系統載入內存執行。
庫有兩種:
在一個程序的編譯過程中,分為以下幾個步驟: 預處理 , 編譯 , 匯編 , 鏈接 。本文中討論的鏈接庫就是針對最後一個步驟「鏈接」而言的。
動態庫和靜態庫的區別
左圖為靜態鏈接庫,右圖為動態鏈接庫
對於靜態鏈接庫而言在鏈接階段,會將匯編生成的「目標文件.o」與引用到的庫一起鏈接打包到可執行文件中。因此對應的鏈接方式稱為靜態鏈接:
靜態鏈接可以理解為最後生成了一個「單文件免安裝綠色版」的程序,優點在於移植的時候只需要移動這一個文件,缺點在於文件體積非常大,為了解決這樣的問題,就有了動態鏈接庫。動態鏈接庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行時才被載入。
動態庫連接到系統空間,如果多個程序連接了同一個庫,那麼只需要一份,優點在於編譯程序的時候不會將對應的庫文件全部打包在生成的程序中,而是保留了到對應庫的鏈接,缺點就是移植的時候如果只移動了對應的程序沒有安裝相關的庫的話,就會看到類似以下喜聞樂見的結果了。
在 Linux 下一個動態庫有y三個不同名字的文件組成:
當程序在內部列出所需要的鏈接庫時,僅僅使用 soname。當你創建一個鏈接庫時,使用 real name。安裝一個新的鏈接庫時,把它復制到一個DLL文件夾里,然後運行程序 ldconfig。ldconfig 檢查存在的 real name 文件,並且創建指向它符號鏈接 soname 文件。可能大家比較常見到的有 libsodium 等。
有了上面關於庫的一些基礎知識之後,我們可以開始嘗試創建一個動態庫來供程序使用了。
比如我們有一個求最大值的函數 max(int a,int b,int c) ,放在文件 max.c 中文件內容如下:
可以通過:
將其編譯為共享庫,-fPIC是編譯選項,PIC是 Position Independent Code 的縮寫,表示要生成位置無關的代碼,這是動態庫需要的特性; -shared是鏈接選項,告訴 gcc 生成動態庫而不是可執行文件。為了讓用戶知道我們的動態庫中有哪些介面可用,我們需要編寫對應的頭文件,比如可以寫一個 max.h :
設置一個驅動函數來測試我們編寫的動態庫:
通過 gcc test.c -L. -lmax來生成 a.out,其中-lmax表示要鏈接 libmax.so,-L.表示搜索要鏈接的庫文件時包含當前路徑。
但是這樣直接運行的話,會出現一個錯誤:
由於 Linux 是通過/etc/ld.so.cache文件搜尋要鏈接的動態庫的,而 /etc/ld.so.cache 是 ldconfig 程序讀取 /etc/ld.so.conf 文件生成的,本次使用的動態庫 libmax.so 並不在對應的目錄下,就會導致程序無法找到對應的動態鏈接庫,這樣我們的解決方法有二:
小結
動態鏈接庫是各個系統中的一個重要的組成部分且在 Linux 開發相關領域中尤為重要,也是一個面試的高頻考點,除了動態鏈接庫以外,還有以下相關知識也是高頻考點,在面試前一定要准備好:
本文作者:Nova Kwok
『柒』 關於linux下連接動態庫問題
gcc編譯時,當使用動態庫編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯
3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫
1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf -a a.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作
你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。
你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。
具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名稱為libSDL2-2.so