您需要區分標題和庫。
標題聲明程序可用的工具。如果包含一個標頭,如<stdio.h>
(注意:這是而不是-重複而不是! - 一個庫),您可以向編譯器提供使用標準I/O庫中設施所需的信息。通常,C頭文件不會定義實現這些設施的實際代碼。 C++具有「僅頭文件」庫(Boost的某些部分是「僅頭文件」庫的主要示例)。
圖書館提供設施的實施。 <stdio.h>
標題聲明瞭一個函數fopen()
;有一個庫定義了該函數。
某些頭文件(實際上通常是很多頭文件)是有特權的,它們聲明的工具包含在C編譯器將程序鏈接到的標準庫中。你不需要做任何特殊的事情來獲得鏈接到你的程序中的功能。其他頭文件來自C編譯器先前不知道的庫,對於這些頭文件,您必須告訴它在哪裏可以找到該庫(例如使用-L /opt/sometool/lib
作爲編譯器選項)和庫名(例如使用-lsometool
與/opt/sometool/lib/libsometool.so
或/opt/sometool/lib/libsometool.a
鏈接)。請注意,SomeTool的標頭可能位於/opt/sometool/include
,您需要添加選項-I/opt/sometool/include
才能找到sometool.h
標頭。
鏈接器不引用標題;編譯器本身不會引用庫。編譯器控制程序處理混合(它通常作爲單獨的程序運行編譯過程的多個階段 - 編譯器與鏈接器分開)。標題不包含有關庫安裝位置的信息。
它在圖書館裏。標準的或明確鏈接的(看鏈接器設置) –
可能的重複問題? https://stackoverflow.com/questions/3368121/how-does-acc-compiler-find-the-definitions-of-prototypes-in-header-files – user3303504