linux的共享物件與window下的動態鏈結檔案是乙個等價的概念,但是不同的作業系統對共享物件的儲存方式不同。而linux 的共享庫也是共享物件的形式,是將多個原始檔編譯為乙個共享物件的方式,這個共享物件就是共享庫,現在共享物件與共享庫的概念已經不再著重區分。
假設現有原始檔 a.c ,將其編譯為共享物件的語句為:
gcc -shared -fpic a.c -o a.so
其中,-shared 指明該檔案是乙個共享物件, -fpic 指定該共享物件採用與位置無關的編譯方式,gcc 還有乙個編譯引數為 -fpic,它與 -fpic 的區別在於小寫的pic指令產生的共享物件更小,但是與作業系統有關,因此,通常採用 -fpic 指令
在當前目錄下假設有另乙個原始檔 b.c ,需要將其編譯為共享物件,且該原始檔依賴與共享物件 a.so,可以通過以下式子指定生成的共享物件 b.so 對共享物件 a.so 的依賴性:
gcc -shared -fpic b.c a.so -o b.so
則獲得了指定了依賴性的共享物件 b.so。假設存在原始檔 main.c 呼叫 b.so 中的函式,則其編譯方式為:
gcc main.c b.so -o main -xlinker -rpath ./
在上述語句中,只需要在編譯時指定共享物件 b.so 即可,不需要再次指定 a.so。且上述語句中的 「 -xlinker -rpath ./ 」 告訴編譯器在當前路徑下尋找共享物件,否則將無法找到共享物件。
linux 中,共享庫也是乙個共享物件,可以將多個原始檔編譯為乙個共享物件,並指定該共享物件的 so-name,編譯命令列如下:
$gcc -shared -wl,-soname,my_soname -o library_name souce_files library_files
假設存在原始檔 a.c 和 b.c 將其編譯為乙個共享庫 libtyy.so。且其對應的so-name 為libtyy。所依賴的現有庫物件名為 lib.so,則獲得共享庫 libtty.so的語句為:
gcc -shared -wl,-soname,libtty -o libtty.so a.c b.c -llib
通過上述語句可以獲得共享庫 libtty.so
通過上面的步驟可以獲得共享庫 libtty.so 。linux 下共享庫的路徑為:/lib(存放系統的關鍵或基本庫),/usr/lib(存放非系統執行時所需要的關鍵性共享庫),/usr/local/lib(存放第三方庫),再就是由/etc/ld.so.conf 檔案中指定的路徑中。
因此,若需要將自己建立的共享庫作為時常會用到的庫,就需要將庫放入上述三個目錄下,或者通過在配置檔案/etc/ld.so.conf中增加庫所在路徑的方式來安裝該庫。
可以使用指令:sudo nautilus 在超級使用者的許可權下開啟檔案管理器,使得我們可以通過複製貼上的方式將共享庫檔案(例如上述生成的libtty.so)放入三個指定目錄中。
將共享庫放入作業系統會搜尋的目錄中後,呼叫指令 ldconfig,該指令會遍歷所有共享庫目錄,對該新裝的共享庫建立其相應的so-name 的軟鏈結。之後編譯原始檔需要用到該共享庫時,其操作與使用系統自帶的共享庫相同。假設原始檔 main.c 需要使用上述建立的共享庫 libtty.so,且該共享庫已經安裝到指定目錄並呼叫了ldconfig,則編譯命令如下:
gcc main.c -o main -ltty //不需要再次指明 lib 字首,注:共享庫的形式必須是 lib***.so***
上述方式即可使用已經安裝的共享庫。
Qt之建立並使用共享庫
在 windows 中,有動態鏈結庫 dll dynamic link library 在 linux 中,有共享庫 shared library 它們是相同的!由於平台和編譯器的差異,輸出的庫檔案也不同 要建立乙個共享庫,需要執行以下幾個步驟 檔案 新建檔案或專案,選擇 library c 庫 選...
12 3 2 建立共享物件
對於 sharedobject 類,不存在 new關鍵字和建構函式的建立語法。sharedobject 物件的建立由 flashplayer 自動處理。sharedobject 類提供乙個 getlocal 方法和乙個 getremote 方法,分別訪問本地和遠端的資料共享物件。當執行此方法後,如果...
QT Creator使用共享庫(一)建立共享庫
最近使用qt的移動裝置要呼叫個加密的.so,在前人 上折騰了n久也沒出來,終於自己照著幫助一步步作了一下,在此記下一筆。使用的工具 qt creator 測試環境 win 7,qt平台的外設 首先我們寫個共享的庫檔案 1.建立c 庫,選擇共享庫 2.在標頭檔案裡加上個方法,並在自動生成的類裡也加上個...