簡體   English   中英

靜態和動態C ++庫

[英]C++ Libraries, Static and Dynamic

我正在閱讀有關c ++庫,靜態/動態庫和鏈接的文章。 我的問題如下:

1)我們必須編譯要插入庫中的文件,然后使用命令ar -crsv創建庫文件? (歸檔文件必須以lib開頭並以.a結尾嗎?)

2)g ++的-I和-L命令是否使用過一次? 向編譯器“說”這些庫在哪里? 還是每次編譯使用庫的源代碼?

3)必須使用#include <>包含Libray嗎? 如果是的話,用什么名字?

我不太了解靜態庫和靜態鏈接的含義以及動態鏈接的含義? 我所了解的是,使用靜態庫和鏈接是在將程序與庫合並時,不需要在原始位置的原始程序嗎? 對於動態,我知道的是DDl,它代表動態鏈接庫。 那么我能想到的唯一的區別就是將DDL加載到主存儲器中,但是我很困惑

有知識的人可以將我的知識(可能是錯誤的)置於正確的順序並進一步解釋這些術語嗎?

謝謝!

假設您的代碼是一個名為main.cpp的文件,如下所示:

#include<headerFromSomeLibrary>
#include<headerFromSomeOtherLibrary>

int main()
{
    int var = functionFromTheLibrary();
    int otherVar = functionFromTheOtherLibrary();

    return var + otherVar;
}

編譯將分兩個步驟進行。

首先,您將使用以下命令將main.cpp編譯為目標文件:

g++ -o main.o -c main.cpp -IheaderDirectory

其中main.o是將要產生的目標文件的名稱和headerDirectory路徑到包含包括在main.cpp中的頭文件的目錄。

為了能夠檢查您的語法是否正確,編譯器將需要知道main.cpp中調用的但未在其中定義的類和函數的外觀(在這種情況下,這些類和函數來自庫,但是它如果它們是由您在另一個文件中定義的,則它們的工作原理相同)。

那就是#include指令出現的地方:它們指向包含所調用函數的聲明的標頭,並允許編譯器執行其工作。 如果聲明位於名為headerFromSomeLibrary.h的頭文件中,則相應的指令將為:

#include<headerFromeSomeLibrary>

此時,結果文件(main.o)包含main.cpp中定義的函數的低級版本在這種情況下,僅是main() )。 它還含有大量的符號,從而識別main.cpp中定義,並呼吁通過main.cpp中的功能。


第二步是鏈接步驟。 鏈接命令如下所示:

g++ -o myProgram main.o -LsomeDirectory -lsomelibrary -lsomeotherlibrary

其中myProgram是您要賦予可執行文件的名稱, headerDirectory是包含頭文件的目錄的路徑, someDirectory是包含libsomeLibrary.alibsomeOtherLibrary.a (正在使用的庫的二進制文件)的目錄的路徑。 。

main.o相似libsomelibrary.alibsomeotherlibrary.a包含函數的定義(即main()中使用的函數)以及標識它們的符號。 鏈接步驟的作用是使用符號將函數定義連接到函數調用。

如果已在文件myfunctions.h中聲明了庫中的函數,並在myfunctions.cpp中對其進行了定義,則編譯說明應如下所示:

g++ -o main.o -c main.cpp
g++ -o myfunctions.o -c myfunctions.cpp
g++ -o myProgram main.o myfunctions.o

基本上,-I選項用於告訴編譯器缺少的標頭在哪里,-l選項用於告訴其缺少的二進制文件的名稱,-L選項用於告訴它在哪里可以找到那些二進制文件。 這些選項不會從一個g ++調用“停留”到下一個調用(這沒有意義)。


現在,您詢問了靜態鏈接和動態鏈接之間的區別。 我上面解釋的實際上是靜態(即編譯時)鏈接。 在靜態鏈接的情況下,編譯器將在庫中獲取所需的函數定義,並將其添加到最終的可執行文件中。 這很好,因為可執行文件不需要其他任何工作,並且編譯器可以在獲取函數后進行優化。

但是,這並不總是您想要做的。 一些庫被許多不同的程序使用,並且您可以通過在程序之間共享庫來節省大量空間。 這就是動態鏈接(即運行時)的情況。 在這種情況下,程序將僅在需要它們時提取它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM