Linux-(C/C++)生成并使用静态库/动态库
- 靜態(tài)庫/動態(tài)庫概要
在Windows下靜態(tài)庫的后綴為:.lib、動態(tài)庫后綴為:.dll;而在Linux下靜態(tài)庫的后綴為:.a、動態(tài)庫的后綴為:.so。
那么什么是靜態(tài)庫呢?
首先我們來看看程序編譯的大體流程:預(yù)處理——編譯——匯編——鏈接
在我們的項目開發(fā)中,有些代碼會被反復(fù)使用,那么這時我們便可將這些代碼編譯成庫的形式來調(diào)用,像靜態(tài)庫就是在可執(zhí)行文件中包含庫代碼的一份完整拷貝,但這種方式有個很嚴(yán)重的缺點就是會造成多份冗余拷貝。靜態(tài)庫會在程序的鏈接階段被復(fù)制到程序中,所以程序在運行后是不會調(diào)用靜態(tài)庫的。
那動態(tài)庫又是什么呢?
動態(tài)庫不像靜態(tài)庫那樣,在鏈接階段并沒有被復(fù)制到程序中,反而是程序運行的時候由系統(tǒng)動態(tài)的加載到內(nèi)存中供程序調(diào)用,所以這里解決了靜態(tài)庫早晨多份冗余拷貝的缺點,系統(tǒng)只需要載入一次動態(tài)庫,不同的程序可以得到內(nèi)存中相同的動態(tài)庫副本,因此可以節(jié)省大量的內(nèi)存。
?
- 生成靜態(tài)庫/動態(tài)庫
下面進(jìn)入主題看看在linux中如何生成靜態(tài)庫跟動態(tài)庫:
首先我們先創(chuàng)建三個文件,分別為hello.cc、hello.h、main.cc,如下圖:
?
“hello.h":
#ifndef __HELLO_H__
#define __HELLO_H__
#include <stdio.h>
void Hello();
#endif
"hello.cc":
#include "hello.h"
void Hello()
{
printf("Hello World!!!\n");
}
"main.cc":
#include "hello.h"
int main(void)
{
Hello();
return 0;
}
這時我們hello world代碼算是寫完了。接下來我們生成靜態(tài)庫:
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(靜態(tài)庫和動態(tài)庫都是由.o文件生成)
g++ -c hello.cc2、為了遵循linux中靜態(tài)庫的命名規(guī)范,靜態(tài)庫命名為libhello.a
ar cr libhello.a hello.o3、將main.cc與靜態(tài)庫連接,生成可執(zhí)行文件:“main”
g++ -o main main.cc -static -lhello -L.最后文件如下如:
4、運行可執(zhí)行文件
./main下面進(jìn)行動態(tài)庫的生成:
1、生成動態(tài)庫libhello.so
g++ -c -fPIC hello.cc -o hello.o
g++ -shared hello.o -o libhello.so
當(dāng)然這里我們可以直接通過cmake來生成動態(tài)庫,下面我們用cmake的方式生成動態(tài)庫并鏈接動態(tài)庫。
首先我們改造下目錄結(jié)構(gòu):
??
我們刪除上一步生成的靜態(tài)庫跟動態(tài)庫,只保留源代碼,在開始的code目錄下創(chuàng)建兩個文件夾分別是:build、lib;在code跟lib目錄下分別創(chuàng)建一個CMakeLists.txt文件(用于編寫cmake代碼),并在code同級目錄下創(chuàng)建code2目錄,在該目錄下創(chuàng)建build、src目錄,將之前的main.cc移到src下,在code2目錄跟src目錄下創(chuàng)建CMakeLists.txt文件,先來看看code目錄下的CMakeLists.txt文件,代碼如下:
PROJECT(HELLOLIB) ADD_SUBDIRECTORY(lib)lib目錄下的CMakeLists.txt文件代碼如下:
SET(LIBHELLO_SRC hello.cc) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) INSTALL(TARGETS hello hello LIBRARY DESTINATION lib) INSTALL(FILES hello.h DESTINATION include/hello)對上面代碼解析下,ADD_LIBRARY用于生成庫文件,hello是動態(tài)庫名(libxxx.x中xxx的名字),SHARED表示生成的庫為動態(tài)庫。之后的INSTALL是安裝共享庫和頭文件,安裝到系統(tǒng)庫中(/usr/lib跟usr/include/hello目錄下,這里的hello文件夾是我自己創(chuàng)建的)。
最后在build目錄下運行終端(在執(zhí)行INSTALL時需要用到root權(quán)限,所以在執(zhí)行make前先切換到root模式下),輸入命令行如下:
cmake -DCMAKE_INSTALL_PREFIX=/usr .. make make install可以到指定目錄中查看庫跟頭文件已經(jīng)成功安裝到了指定目錄下。
下面我們在main.cc中調(diào)用我們生成的動態(tài)庫。
首先我們先將main.cc中引入的頭文件#include "hello.h"改為#include <hello.h>;
我們先看看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是個好東西!你值得擁有!
總結(jié)
以上是生活随笔為你收集整理的Linux-(C/C++)生成并使用静态库/动态库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信语音技术原理_微信语音多群直播原理-
- 下一篇: linux中找不到vim命令