Linux C C 生成並使用靜態庫 動態庫

2021-10-10 17:46:35 字數 3637 閱讀 5338

在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.og++ -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字尾。動態庫...