我很好奇c/C++編譯器如何分析lib文件?我的意思是說我創建了一個包含一些類的庫,我在我的主程序中使用了這個庫。編譯器如何知道該庫中有什麼類名。當然,這些信息以二進制格式存在,我想在我的程序中使用該功能,具體來說,我有一個二進制lib文件,並且我想知道該lib文件中存在的所有類和屬性/函數。編譯器如何使用lib文件?
可能嗎?如果編譯器可以做到這一點,爲什麼不能一些庫?
感謝任何線索
我很好奇c/C++編譯器如何分析lib文件?我的意思是說我創建了一個包含一些類的庫,我在我的主程序中使用了這個庫。編譯器如何知道該庫中有什麼類名。當然,這些信息以二進制格式存在,我想在我的程序中使用該功能,具體來說,我有一個二進制lib文件,並且我想知道該lib文件中存在的所有類和屬性/函數。編譯器如何使用lib文件?
可能嗎?如果編譯器可以做到這一點,爲什麼不能一些庫?
感謝任何線索
編譯器不會做你的建議是什麼,但鏈接程序。
編譯器從與lib文件相關的頭文件中知道它需要的信息。
然後鏈接程序將您正在包含的聲明和lib文件及其他對象文件放在一起。
例如,通過反編譯它可能從.lib文件中獲取信息,但這可能有很多工作,可能不是您要做的。
爲了在代碼擊中鏈接器時放大Brian R. Bondy's answer,最有用的人類信息已被刪除。例如,您可以從目標文件(庫)中提取以下信息:
class SomeClass implements SomeInterface {
int get(class &otherClass c, float x);
bool reallyCoolMethod(int x);
...
}
這確實比實用程度少。圖書館文檔應該解釋你爲什麼要使用它以及如何使用它;如果圖書館沒有如此記錄,你可能需要一個更好的圖書館。
我不認爲C++有接口:\ – 2010-04-03 19:17:16
根據你的系統(我知道這對於Linux上的.a
文件是真的,對windows不太確定)庫文件只是一個存檔文件(因此.a
)包含一堆普通的目標文件。認爲焦油或拉鍊,你會很關閉。鏈接器或多或少只是從檔案中提取文件,在命令行中粘貼它們並將所有內容鏈接在一起(實際上並沒有這樣做,因爲它有一些特殊的規則,比如只是懶惰地收集東西,但對於主題來說足夠接近在眼前)。
如果你想知道里面有什麼,可以使用庫工具(Linux上的IIRC ar
)並深入研究文檔。即使金錢說,該工具將能夠提取目標文件,並從那裏你可以使用標準工具來提取其內容。
通常,一個.a
庫只是一個存檔,它本身包含一堆目標文件。這些命令是在Linux上完成的,它會因平臺而異。通常,您可以通過運行nm libxxx.a
/usr/lib> nm libc.a | head -10
init-first.o:
U abort
U _dl_non_dynamic_init
0000000000000000 T _dl_start
w _dl_starting_up
U __environ
U __fpu_control
U __init_misc
0000000000000004 C __libc_argc
的nm
幫助頁中大量的細節什麼的輸出手段檢查檔案的基本內容。
ar
命令可以爲您提取單個文件,例如
~/tmp> ar x libc.a init-first.o
~/tmp> file init-first.o
init-first.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
正如你可以在上面看到,這裏的對象是ELF格式,所以對於你問什麼複雜一點,你真正需要的是什麼,可以檢查ELF二進制文件。Linux的通常附帶命令readelf
這將在命令行中給予了很多的信息:
~/tmp> readelf -s init-first.o
Symbol table '.symtab' contains 19 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 SECTION LOCAL DEFAULT 1
2: 00000000 0 SECTION LOCAL DEFAULT 3
3: 00000000 0 SECTION LOCAL DEFAULT 4
4: 00000000 0 SECTION LOCAL DEFAULT 5
5: 00000000 0 SECTION LOCAL DEFAULT 6
6: 00000000 11 FUNC GLOBAL DEFAULT 1 _dl_start
7: 00000000 0 NOTYPE GLOBAL DEFAULT UND abort
8: 00000010 133 FUNC GLOBAL DEFAULT 1 __libc_init_first
9: 00000000 0 NOTYPE WEAK DEFAULT UND _dl_starting_up
...
設有一個圖書館libelf
這很有可能你想要做什麼和編程訪問這些信息。我從來沒有使用它,因爲我總是從可用的命令行工具中獲得所需的信息。
我們可以在我們的程序中使用該功能嗎?有沒有任何鏈接器知道類名和屬性的庫? – Xinus 2010-04-03 05:37:36
@Xinux:可能但我不知道他們。 – 2010-04-03 05:58:29