Linux-(C/C++)生成并使用靜態庫/動態庫

  • 靜態庫/動態庫概要

在Windows下靜態庫的后綴為:.lib、動態庫后綴為:.dll;而在Linux下靜態庫的后綴為:.a、動態庫的后綴為:.so。

那么什么是靜態庫呢?

首先我們來看看程序編譯的大體流程:預處理——編譯——匯編——鏈接

在我們的項目開發中,有些代碼會被反復使用,那么這時我們便可將這些代碼編譯成庫的形式來調用,像靜態庫就是在可執行文件中包含庫代碼的一份完整拷貝,但這種方式有個很嚴重的缺點就是會造成多份冗余拷貝。靜態庫會在程序的鏈接階段被復制到程序中,所以程序在運行后是不會調用靜態庫的。

那動態庫又是什么呢?

動態庫不像靜態庫那樣,在鏈接階段并沒有被復制到程序中,反而是程序運行的時候由系統動態的加載到內存中供程序調用,所以這里解決了靜態庫早晨多份冗余拷貝的缺點,系統只需要載入一次動態庫,不同的程序可以得到內存中相同的動態庫副本,因此可以節省大量的內存。

?

  • 生成靜態庫/動態庫

下面進入主題看看在linux中如何生成靜態庫跟動態庫:

首先我們先創建三個文件,分別為hello.cc、hello.h、main.cc,如下圖:

?

“hello.h":

 
  1. #ifndef __HELLO_H__

  2. #define __HELLO_H__

  3. ?
  4. #include <stdio.h>

  5. ?
  6. void Hello();

  7. ?
  8. #endif

"hello.cc":

 
  1. #include "hello.h"

  2. ?
  3. void Hello()

  4. {

  5. printf("Hello World!!!\n");

  6. }

"main.cc":

 
  1. #include "hello.h"

  2. ?
  3. int main(void)

  4. {

  5. Hello();

  6. ?
  7. return 0;

  8. }

這時我們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

 
  1. g++ -c -fPIC hello.cc -o hello.o

  2. 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 ${LIBHELLO_SRC})
INSTALL(TARGETS hello hello
LIBRARY DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)

對上面代碼解析下,ADD_LIBRARY用于生成庫文件,hello是動態庫名(libxxx.x中xxx的名字),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 <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是個好東西!你值得擁有!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows下最好的圍棋_學圍棋能使學習成績提高嗎?

孩子幾歲開始學習圍棋最合適&#xff1f;當然要4歲開始學圍棋。一是因為&#xff1a;4歲是幼兒形狀知覺形成的關鍵期&#xff0c;圍棋千變萬化的棋形(見文后圖)是最有利于促進與鍛煉孩子形狀知覺的形成。二是因為&#xff1a;人的大腦在3周歲后基本已經發育了60%&#xff0c;到…

每日站立會議05

組員一起討論軟件和關鍵功能的實現&#xff0c;在查詢相關資料、詢問老師、查詢網絡之后&#xff0c;無果。轉載于:https://www.cnblogs.com/zuhaoran/p/5435904.html

C#與C/C++的交互zz

C#與C交互&#xff0c;總體來說可以有兩種方法&#xff1a; 利用C/CLI作為代理中間層 利用PInvoke實現直接調用 第一種方法&#xff1a;實現起來比較簡單直觀&#xff0c;并且可以實現C#調用C所寫的類&#xff0c;但是問題是MONO構架不支持C/CLI功能&#xff0c;因此無法實現脫…

curl查看swift狀態命令_HTTP 請求與響應包括哪些,如何用Chrome查看 HTTP 請求與響應內容和curl 命令的使用...

1.HTTP的請求和響應其實就是通過電腦上的軟件來進行的&#xff0c;客戶端請求的內容發送到服務器上&#xff0c;服務器收到請求后就會響應客戶端的請求&#xff0c;如圖&#xff1a;HTTP請求的內容及格式&#xff1a;請求最多包含四部分&#xff0c;最少包含三部分。&#xff0…

Pytorch的BatchNorm層使用中容易出現的問題

前言 本文主要介紹在pytorch中的Batch Normalization的使用以及在其中容易出現的各種小問題&#xff0c;本來此文應該歸屬于[1]中的&#xff0c;但是考慮到此文的篇幅可能會比較大&#xff0c;因此獨立成篇&#xff0c;希望能夠幫助到各位讀者。如有謬誤&#xff0c;請聯系指出…

android 比較靠譜的圖片壓縮

2019獨角獸企業重金招聘Python工程師標準>>> 第一&#xff1a;我們先看下質量壓縮方法&#xff1a; private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, …

jetty上手

jetty簡介&#xff1a;維基百科 Jetty是一個純粹的基于Java的網頁服務器和Java Servlet容器。盡管網頁服務器通常用來為人們呈現文檔&#xff0c;但是Jetty通常在較大的軟件框架中用于計算機與計算機之間的通信。Jetty支持最新的Java Servlet API&#xff08;帶JSP的支持&#…

常用公差配合表圖_ER彈簧夾頭配套BT刀柄常用規格型號表

ER彈簧夾頭具有定心精度高&#xff0c;夾緊力均勻的特點&#xff0c;廣泛用于機械類零件的精加工和半精加工&#xff0c;通常與BT刀柄匹配使用。BT刀柄是是機械主軸與刀具和其它附件工具連接件&#xff0c;BT為日本標準(MAS403)&#xff0c;現在也是普遍使用的一種標準。傳統刀…

Spatial Transformer Networks(STN)

詳細解讀Spatial Transformer Networks&#xff08;STN&#xff09;-一篇文章讓你完全理解STN了_多元思考力-CSDN博客_stn

Linux下python安裝升級詳細步驟 | Python2 升級 Python3

Linux下python升級步驟 Python2 ->Python3 多數情況下&#xff0c;系統自動的Python版本是2.x 或者yum直接安裝的也是2.x 但是&#xff0c;現在多數情況下建議使用3.x 那么如何升級呢&#xff1f; 下面老徐詳細講解升級步驟&#xff1b; 首先下載源tar包 可利用linux自帶下…

華為手機連電腦_手機、電腦無網高速互傳!華為神技逆天

Huawei Share是華為的一項自研多終端傳輸技術&#xff0c;可以在沒有網絡狀態下實現手機與手機、電腦等多終端設備間快速穩定的文件分享&#xff0c;尤其是在辦公場景下&#xff0c;可以極大提升辦公效率。華為表示&#xff0c;未來Huawei Share將應用于更多全場景跨設備無縫分…

【無標題】移動端深度學習開源框架及部署(對比)

移動端深度學習開源框架及部署 - 凌逆戰 - 博客園

Github基本操作的學習與溫習

GitHub是最先進的分布式版本控制工具&#xff0c;下面是我學習中總結的操作流程&#xff0c;僅供參考 -----------------------------------------------------------------------------------------------------------------------------------------------------------------…

excel統計行數_值得收藏的6個Excel函數公式(有講解)

收藏的Excel函數大全公式再多&#xff0c;幾天不用也會忘記。怎么才能不忘&#xff1f;你需要了解公式的運行原理。小編今天不再推送一大堆函數公式&#xff0c;而是根據提問最多的問題&#xff0c;精選出6個實用的&#xff0c;然后詳細的解釋給大家。1、計算兩個時間差TEXT(B2…

Studio One正版多少錢 Studio One正版怎么購買

隨著版權意識的增強&#xff0c;打擊盜版的力度越來越大&#xff0c;現在網絡上的盜版資源越來越少&#xff0c;資源少很難找是一方面&#xff0c;另一方面使用盜版軟件不僅很多功能不能使用&#xff0c;而且很多盜版軟件都被植入各種木馬病毒&#xff0c;從而帶來各種各樣的風…

DNS簡述

常見DNS記錄SOA&#xff1a;域權威開始NS&#xff1a;權威域名服務器A&#xff1a;主機地址CNAME&#xff1a;別名對應的正規名稱MX&#xff1a;郵件傳遞服務器PTR&#xff1a;域名指針 (用于反向 DNS)查詢過程瀏覽器緩存->hosts->LDNS->LDNS緩存->ISP->ISP緩存…

cuda gpu相關匯總

1.Ubuntu16.04:在anaconda下安裝pytorch-gpu 轉自&#xff1a;Ubuntu16.04:在anaconda下安裝pytorch-gpu_莫等閑996的博客-CSDN博客 1 創建虛擬環境并進入 conda create -n pytorch-gpu python3.6 conda activate pytorch-gpu 2 下載對應的安裝包和配件 方法一(推薦)&#…

普通人學python有意義嗎_學python難嗎

首先&#xff0c;對于初學者來說學習Python是不錯的選擇&#xff0c;一方面Python語言的語法比較簡單易學&#xff0c;另一方面Python的實驗環境也比較容易搭建。學習Python需要的時間取決于三方面因素。(推薦學習&#xff1a;Python視頻教程)其一是學習者是否具有一定的計算機…

karatsuba乘法

karatsuba乘法 Karatsuba乘法是一種快速乘法。此算法在1960年由Anatolii Alexeevitch Karatsuba 提出&#xff0c;并于1962年得以發表。[1]此算法主要用于兩個大數相乘。普通乘法的復雜度是n2&#xff0c;而Karatsuba算法的復雜度僅為3nlog3≈3n1.585&#xff08;log3是以2為底…

在Visual Studio上開發Node.js程序(2)——遠程調試及發布到Azure

【題外話】 上次介紹了VS上開發Node.js的插件Node.js Tools for Visual Studio&#xff08;NTVS&#xff09;&#xff0c;其提供了非常方便的開發和調試功能&#xff0c;當然很多情況下由于平臺限制等原因需要在其他機器上運行程序&#xff0c;進而需要遠程調試功能&#xff0c…