在windows下靜態庫的字尾為:.lib、動態庫字尾為:.dll;而在linux下靜態庫的字尾為:.a、動態庫的字尾為:.so。
那麼什麼是靜態庫呢?
在我們的專案開發中,有些**會被反覆使用,那麼這時我們便可將這些**編譯成庫的形式來呼叫,像靜態庫就是在可執行檔案中包含庫**的乙份完整拷貝,但這種方式有個很嚴重的缺點就是會造成多份冗餘拷貝。靜態庫會在程式的鏈結階段被複製到程式中,所以程式在執行後是不會呼叫靜態庫的。
那動態庫又是什麼呢?
動態庫不像靜態庫那樣,在鏈結階段並沒有被複製到程式中,反而是程式執行的時候由系統動態的載入到記憶體中供程式呼叫,所以這裡解決了靜態庫早晨多份冗餘拷貝的缺點,系統只需要載入一次動態庫,不同的程式可以得到記憶體中相同的動態庫副本,因此可以節省大量的記憶體。
下面進入主題看看在linux中如何生成靜態庫跟動態庫:
首先我們先建立三個檔案,分別為hello.cc、hello.h、main.cc,如下圖:
#include "hello.h"
int main(void)
這時我們hello world**算是寫完了。接下來我們生成靜態庫:
g++ -o main main.cc -static -lhello -l.
我們先簡單介紹下"gcc"跟"g++":gcc 最開始的時候是 gnu c compiler, 如你所知,就是乙個c編譯器。但是後來因為這個專案裡邊整合了更多其他不同語言的編譯器,gcc就代表 the gnu compiler collection,所以表示一堆編譯器的合集。 g++則是gcc的c++編譯器。
此處我們使用g++,如果使用c語言可以將g++改為gcc:
1、將hello.cc編譯成hello.o(靜態庫和動態庫都是由.o檔案生成)
g++ -c hello.cc
2、為了遵循linux中靜態庫的命名規範,靜態庫命名為libhello.a
ar cr libhello.a hello.o
3、將main.cc與靜態庫連線,生成可執行檔案:「main」
g++ -o main main.cc -static -lhello -l.
最後檔案如下如:
4、執行可執行檔案
./main
下面進行動態庫的生成:
1、生成動態庫libhello.so
g++ -c -fpic hello.cc -o hello.o
g++ -shared hello.o -o libhello.so
當然這裡我們可以直接通過cmake來生成動態庫,下面我們用cmake的方式生成動態庫並鏈結動態庫。
首先我們改造下目錄結構:
我們刪除上一步生成的靜態庫跟動態庫,只保留源**,在開始的code目錄下建立兩個資料夾分別是:build、lib;在code跟lib目錄下分別建立乙個cmakelists.txt檔案(用於編寫cmake**),並在code同級目錄下建立code2目錄,在該目錄下建立build、src目錄,將之前的main.cc移到src下,在code2目錄跟src目錄下建立cmakelists.txt檔案,先來看看code目錄下的cmakelists.txt檔案,**如下:
project(hellolib)
add_subdirectory(lib)
lib目錄下的cmakelists.txt檔案**如下:
set(libhello_src hello.cc)
add_library(hello shared $)
install(targets hello hello
library destination lib)
install(files hello.h destination include/hello)
對上面**解析下,add_library用於生成庫檔案,hello是動態庫名(lib***.x中***的名字),shared表示生成的庫為動態庫。之後的install是安裝共享庫和標頭檔案,安裝到系統庫中(/usr/lib跟usr/include/hello目錄下,這裡的hello資料夾是我自己建立的)。
最後在build目錄下執行終端(在執行install時需要用到root許可權,所以在執行make前先切換到root模式下),輸入命令列如下:
cmake -dcmake_install_prefix=/usr ..
make
make install
可以到指定目錄中檢視庫跟頭檔案已經成功安裝到了指定目錄下。
下面我們在main.cc中呼叫我們生成的動態庫。
首先我們先將main.cc中引入的標頭檔案#include "hello.h"改為#include ;
我們先看看code2目錄下的cmakelists.txt下的指令碼:
project(newhello)
add_subdirectory(src)
src目錄下的cmakelists.txt指令碼如下:
add_executable(main main.cc)
include_directories(/usr/include/hello)
target_link_libraries(main libhello.so)
跟上面一樣我們在終端下來到build目錄,並輸入命令列如下:
cmake ..
make
得到的輸出為:hello world!!!
到這裡我們鏈結庫的例項就說完了。cmake是個好東西!你值得擁有!
linux C C 之庫編譯靜態庫 共享庫
我們在編寫乙個c語言程式的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響 的可讀性,更不利於後期的 維護。我們可以把他們製作成相應的功能函式,使用時直接呼叫就會很方便,還可以進行後期的功能公升級。例如我要在一段 中多次交換兩個變數的值,我可...
Vivado SDK生成 使用靜態庫
針對需要進行智財權保護的 可以通過庫的方式進行處理。在xilinx vivado環境下,針對non os環境,可以使用靜態庫 針對linux環境,可以使用靜態庫和動態庫。這裡,對non os環境下,靜態庫的生成和使用方法進行記錄。基本參考 xilinx sdk及其官網上的靜態庫生成和使用方法,我自己...
gcc g 生成 使用動態庫 靜態庫
gcc shared my.c o libmy.so有時候會報錯提示加上 fpic flag position independent code,為了生成位置無關 用全域性偏移的方式,乙份動態庫即可給多份主程式使用,細節自己網上查吧 加上就行了。libmy.so檔案注意lib字首和.so字尾。動態庫...