2016-02-05 19 views
2

我讀this site說,如果我做的:聯動在包括<name.h>和libname.o

include<name.h> 

然後我的庫對象的格式libname.o。但是例如,this site表示包含math.h的庫名稱是libm.a.我在這裏弄錯了什麼?

+0

你確定這是libname.o擴大到libname.alibname.so?是它的libname.so? – dlmeetei

+0

'#include'包含一個頭文件(源代碼)。將編譯後的代碼與靜態('.a')或共享('.so')庫鏈接是一個單獨的步驟。 – e0k

回答

2

命名約定name.hlibname.a就是這樣一個約定。許多圖書館都遵循它,但不是全部。特別是,許多平臺只有一個文件中的所有C庫,不管分類到不同的頭文件中,該文件都是libc.a。其他人在libm.a中有額外的數學庫部分。

+0

,因爲他編譯與-lm?另外,編譯器如何知道libm.a是用於math.h的,因爲它的所有二進制文件都是? – Gatonito

1

庫可以是staticdynamic庫,靜態庫將具有libname.a表格的名稱,也稱爲歸檔文件,而動態庫將具有libname.so,也稱爲共享對象(so)。

作爲一個約定,人們通常會遵循相關性name.hlibname.*以便容易忍受:)但這僅僅是一種約定。您可以在打包圖書館時遵循自己的命名。

當鏈接時,我們指定使用-lname庫,得到了由自動鏈接

+0

o因爲他編譯了-lm?另外,編譯器如何知道libm.a是用於math.h的,因爲它的所有二進制文件都是? – Gatonito

+0

編譯器沒有。用戶必須提供。每當鏈接器需要鏈接的符號時,它會檢查提供的庫。 – dlmeetei