回覆列表
  • 1 # 使用者6187083252663

    標準庫的標頭檔案裡的內容,編譯時會隨著一連串的“#include”貼上到你的程式碼裡。通常,你可以找到庫函式的宣告,但是找不到他們的定義。編譯器也不需要知道他們的實現,只需提供他們的簽名(function signature)就能使用這些函式。把宣告和定義對應起來是聯結器的工作。C/C++編譯器接受原始檔(.c和.cpp等),生成目標檔案(.o和.obj)。聯結器接受目標檔案,生成可執行檔案(.exe, .com, .out等等等等)。許多教科書都介紹過這個過程,但是僅靠目標檔案是沒辦法讓你的程式成功編譯的。還需要動態連結庫和靜態連結庫。許多API的實現都放在這兩類檔案內。每當聯結器工作時,都可以指定所需的庫,讓這些庫參與連線。靜態連結庫(.a和.lib)可以看作一堆目標檔案的集合。當其中某個函式被呼叫時,就把其所在的目標檔案抽出來,加入到連線過程中。這樣可以省下不少的編譯耗時,也可以避免使用者直接接觸庫程式碼。動態連線庫(.so和.dll)則有所不同。聯結器在讀取動態連結庫後,同樣會為其分配記憶體地址和空間,但不會將相應的內容複製到可執行檔案中。在程式執行時作業系統將動態連結庫直接載入至記憶體,在執行時連線。動態連結庫除了可以擁有靜態連結庫的上述特點外,還有其它的長處。當多個程序使用同一個動態連結庫時,這個庫只需載入一次,然後就可以被這些程序共享,既省空間又省時間。但是,由於沒有固定的地址,動態連結庫的執行效率可能會有一定的損失。你可能從來沒聽說過這兩個玩意,其實基本上你的每一個程式都用到了他們。在Visual Studio的C/C++專案屬性裡指定了一堆lib和dll。gcc連線時會使用libstdc++.so,clang則會使用libc++.so,這兩個庫實現了C/C++標準庫內的絕大部分功能。連線庫是大多數應用程式工作的基礎,幾乎沒有可以脫離連結庫工作的程式。例如math.h/cmath, stddef.h/cstddef,他們只需要標頭檔案和靜態/動態連結庫就能完成。還有一些特殊的功能,比如申請記憶體,操作終端,讀寫檔案,從鍵盤接受輸入,網路通訊等等,不是標頭檔案和連線庫們可以獨立完成的,必須依靠作業系統。他們發起系統呼叫,執行一系列指令,使CPU進入核心態,執行核心中的相應程式碼。完成任務後,再回到使用者態,繼續執行當前程序或其他程序。所以標準庫在哪?標準庫是函式簽名、資料型別和宏的集合,所以,當然在標頭檔案裡。

  • 2 # 藍風24

    這個應該和你呼叫ti的庫是一個概念,包含標頭檔案,工程會在src搜尋.c檔案中函式的定義,會在lib庫裡搜尋函式的定義,只要把lib在選項的路徑什麼都加對,差不多就可以用了

  • 中秋節和大豐收的關聯?
  • 朋友為我辦事向我要了2萬,最後事情沒有幫我辦好,感覺被騙,請問這錢有辦法要回來嗎?