什么是obj文件?


百度百科:

  程序編譯時生成的中間代碼文件。目標文件,一般是程序編譯后的二進制文件,再通過鏈接器(LINK.EXE)和資源文件鏈接就成可執行文件了。OBJ只給出了程序的相對地址,而可執行文件是絕對地址。[1] 

     這個問題不是很簡單,你只看到了文件從源代碼到EXE文件這個流程中的一小部分。要詳細的深究這個問題,需要很多時間和精力。
 
 
    
    
     應該是在上圖的第四個步驟,會產生obj文件。但它表述的還不夠全面,少了一個鏈接的部分,所以應該在第五步之前再加上一個鏈接的步驟;
     資源鏈接很好理解,但鏈接器(LINK.EXE)?
    ——鏈接器(LINK.EXE)是鏈接.lib文件、.obj目標文件、.res;.lib文件又稱之為導入庫文件,只記錄了函數所在DLL的位置。
 
.lib導入庫的概念:     
     導入庫是一個很棒的做法,如果硬件將平台比作房子,系統比作苦力,API比作積木;然后我們要寫的程序比作一張圖紙,要苦力按照圖紙搭建成我們所需要的積木形狀;我們所寫的源代碼更多,更形象的是完成這個積木的思想,API更像是在這間房子里,所有能讓苦力完成這個積木素材。而導入庫的概念,就好比將我寫的源代碼思想通過編譯器、資源編譯器、鏈接器翻譯成苦力能懂的鳥語。然后鏈接器再鏈接.lib文件,告訴苦力需要搭建的積木的素材都在什么地方,讓你好去找啊?如果苦力沒有,我做好了這個素材直接給你就得了(如DLL、聲音、圖片、光標)。如果你有我還給苦力另一個同樣的積木(Dos下的靜態庫),那不是脫了褲子放屁么?
.obj目標文件的概念:
  可見,在我們的編程語言和計算機中間多了一個編譯器,我更形象的將它理解為我們與計算機之間的翻譯。翻譯做的事情,我必然看不懂,但它的工作成果就是obj、res、exe這些二進制文件;所有的翻譯,在某種程度上都存在欺騙的可能性...這是題外話,所以obj文件是什么?是計算機所能理解的二進制代碼,是編譯成exe過程中需要的第一步、是ML.exe運行后的結果。
.obj和.exe有什么不同?換句話說編譯器和鏈接器分別做了什么呢:
  從表面上看.obj不能執行,但是.exe可以執行.還有他們的后綴名不同、.exe比.obj多了.lib、.res文件;除此之外,要論述<.obj和.exe有什么不同>這個問題,那么必然要切入<編譯器和鏈接器分別做了什么呢>這個問題,但是這已經超出我問這個問題的初衷了.我會有這個問題只是因為<編譯執行和解釋執行有什么差別,為什么會產生.obj文件,而obj文件又是什么>這個問題.從此問題引申出來的其他問題,就不在深究,留在以后再說吧...
編譯執行和解釋執行:
  這個問題是這些問題的原始問題,換句話說其他問題都是這個問題的延伸;如果抽象一下也很有意思的,編譯執行就好像是Link.exe直接給了苦力一張它懂的紙條,我全部都苦力你干什么,干完就完事;而解釋執行就好像給苦力陪了一台隨身攜帶的翻譯器,苦力勞作一下,翻譯器再告訴苦力下一個命令,直到苦力將翻譯器中的所有命令都完成才罷休。
  這個比喻也完美的解釋了“解釋執行能跨平台,而編譯執行卻不行”,因為后者直接給了一張紙,要么苦力看得懂,要么苦力看不懂,看不懂那就干不了,這很正常(因為苦力也分種族)...而前者直接實現了“人工智能”,苦力是哪里的人翻譯器就說哪里的話..速度的問題,也完美的解釋了,一張紙和翻譯器相比,當然前者更快...
什么是相對地址:
 
什么是絕對地址:  
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM