⑴ C語言源程序文件名的後綴是.OBJ,經過編譯後,生成文件的後綴是什麼經過連接後,生成文件的後綴是什麼
C語言源程序文件名的後綴是.c。C源程序經過C編譯程序編譯之後生成一個後綴為.OBJ的二進制文件,
然後由稱為「連接程序」的軟體,把此.OBJ文件與C語言提供的各種庫函數連接起來生成一個後綴為.EXE的可執行文件。
由高級語言編寫的程序稱為「源程序」,把由二進制代碼表示的程序稱為「目標程序」。為了把源程序轉換成機器能接受的目標程序,這時我們需要具有翻譯功能的軟體--「編譯程序」。每種高級語言都有與它對應的編譯程序。
(1)c程序編譯後obj是二進制嗎擴展閱讀
1、目標文件的擴展名為「.obj」(Windows)或「.o」(Linux)。目標文件已經是機器指令,但還不能運行,因為目標文件還沒有解決函數調用問題。
2、可執行文件的擴展名為「.exe「。
⑵ C語言中的obj
obj文件是目標文件,一般是程序編譯後的二進制文件,在通過鏈接器和資源文件鏈接就成exe文件了。
OBJ只給出了程序的相對地址,而EXE是絕對地址。
OBJ文件不支持有孔的多邊形面。
舉個例子說明一下:
選擇Maya的創建多邊形工具(Polygons -> Create Polyon Tool),在視圖中畫一個四邊形,不要按回車,按Ctrl在四邊形中間點一下,可以繼續在四邊形中挖一個洞。把這個有孔的多邊形存成OBJ格式,在導入Maya時,會發現多邊形少了一塊。如果你把這也看成錯誤,現在至少你已經知道錯誤的原因了,就是OBJ文件不支持有孔的多邊形面。
OBJ文件 -- 實際問題:
現在來討論一點比較實際的問題吧,就是一旦你遇到了一個出錯的OBJ文件,倒底該怎麼辦?
當你打開OBJ文件後,往往會看到有幾萬行的代碼,你恐怕還沒本事情一眼看出錯誤所在行,除非程序的錯誤信息中已經告訴你錯誤行。如果你不知道錯誤在哪裡,可以用排除法,弄清楚肯定正確的代碼范圍,通過縮減錯誤代碼范圍定位錯誤。例如,你先新建一個空的OBJ文件,把有錯的OBJ文件代碼粘貼一半過來,然後把這個只有一半代碼的新OBJ文件導入Maya。如果這時沒有錯誤信息,說明錯誤行是在另一半代碼中,可以從另一半代碼中再粘貼一部分代碼試試看;如果這時出現錯誤,說明錯誤行就在粘貼的代碼中,可以把粘貼過來的代碼刪去一部分再試試看。就這樣,逐步縮減范圍直到找到錯誤行為止。
這種方法雖然很麻煩,不過頗為有效。如果你不會編程,又遇到非常緊急的情況,這種方法還是值得一試的。
OBJ文件 -- 細節:
掌握了這么多差不多也夠用了,不過由於網上詳細講解OBJ文件的中文文檔很少,我還是再講一些例子,給大家提供多一點的信息吧。
簡單的OBJ格式寫法。
# Simple Wavefront file
v 0.0 0.0 0.0
v 0.0 1.0 0.0
v 1.0 0.0 0.0
f 1 2 3
面可以使用負值索引,有時用負值索引描述面更為簡便。
"f -4 -3 -2 -1"這句索引值"-3"表示從"f"這行往上數第3個頂點,就是"v -0.500000 0.000000 -0.800000",其它的索引值以此類推。 因此與這一行等效的正值索引寫法為:"f 1 2 3 4"
v -0.500000 0.000000 0.400000
v -0.500000 0.000000 -0.800000
v -0.500000 1.000000 -0.800000
v -0.500000 1.000000 0.400000
f -4 -3 -2 -1
OBJ文件不包含面的顏色定義信息,不過可以引用材質庫,材質庫信息儲存在一個後綴是".mtl"的獨立文件中。關鍵字"mtllib"即材質庫的意思。
材質庫中包含材質的漫射(diffuse),環境(ambient),光澤(specular)的RGB(紅綠藍)的定義值,以及反射(specularity),折射(refraction),透明度(transparency)等其它特徵。
"usemtl"指定了材質之後,以後的面都是使用這一材質,直到遇到下一個"usemtl"來指定新的材質。
⑶ 如何打開C語言編譯出的OBJ格式文件
OBJ 文件是二進制的文件,代碼已經是機器碼了,可用反匯編程序打開試試,不過看到的是匯編語言的程序若你會用debug,可以用它來試試
⑷ c語言編譯生成的.obj文件解釋下
c語言編譯生成的.obj文件是一種文本文件,程序編譯時生成的中間代碼文件目標文件,一般是程序編譯後的二進制文件,再通過鏈接器和資源文件鏈接就成可執行文件了。OBJ只給出了程序的相對地址,而可執行文件是絕對地址。
obj文件基本結構:OBJ文件不需要任何種文件頭(File Header),盡管經常使用幾行文件信息的注釋作為文件的開頭。
OBJ文件由一行行文本組成,注釋行以符號「#」為開頭,空格和空行可以隨意加到文件中以增加文件的可讀性。有字的行都由一兩個標記字母也就是關鍵字(Keyword)開頭,關鍵字可以說明這一行是什麼樣的數據。
(4)c程序編譯後obj是二進制嗎擴展閱讀:
C編譯的整個過程很復雜,大致可以分為以下階段:
1、預處理階段
在該階段主要完成對源代碼的預處理工作,主要包括對宏定義指令,頭文件包含指令,預定義指令和特殊字元的處理,如對宏定義的替換以及文件頭中所包含的文件中預定義代碼的替換等,總之這步主要完成一些替換工作,輸出是同源文件含義相同但內容不同的文件。
2、編譯、優化階段
編譯就是將第一階段處理得到的文件通過詞法語法分析等轉換為匯編語言。優化包括對中間代碼的優化,如刪除公共表達式,循環優化等;和對目標代碼的生成進行的優化,如如何充分利用機器的寄存器存放有關變數的值,以減少內存訪問次數。
3、匯編階段
將匯編語言翻譯成機器指令。
⑸ C語言被編譯後是匯編程序嗎
當然不是,編譯後是OBJ文件,連接後成立可執行代碼,是二進制機器碼了。
⑹ c++ obj文件與exe文件的區別
編譯:當前源代碼編譯成二進制目標文件(.obj文件)
鏈接(link):將生成的.obj文件與庫文件.lib等文件鏈接,生成可執行文件(.exe文件)。
可以說.obj文件是.exe文件的前身;
1、obj里存的是編譯後的代碼跟數據,並且有名稱,所以在連接時會出現未解決的外部符號一說。當連成exe後便不存在名稱的概念了,只有地址。lib就是一堆obj的組合。
編譯器會默認鏈接一些常用的庫,其它的需要你自己指定。
2、目標文件,一般是程序編譯後的【二進制文件】,再通過鏈接器和資源文件鏈接就成可執行文件了。OBJ只給出了程序的【相對地址】,而可執行文件是【絕對地址】。CPP對應的二進制代碼格式obj,是未經重定位的!
3、編譯C 程序會產生obj 文件和exe 文件,我們都知道exe 文件是可執行文件,但obj 文件是做什麼用的呢?
查了下資料發現obj 文件和exe 文件都是二進制數據文件,其中obj 文件是COFF 格式,exe 文件時PE 格式。
那為什麼不直接讓 obj 文件作為可執行文件呢?
原來obj 文件的格式是跨平台 的,通過link 可以將obj 鏈接為所使用系統能夠識別的格式,比如windows 系統中的exe 文件。
一個現代編譯器的主要工作流程如下:
源程序(source code)→ 預處理器(preprocessor)→ 編譯器(compiler)→ 匯編程序(assembler)→ 目標程序(object code)→ 連接器(鏈接器,Linker)→ 可執行程序(executables)
(6)c程序編譯後obj是二進制嗎擴展閱讀
C++編譯 (.obj, .lib, .dll, .exe的關系)
一、總體介紹:
c++程序在編譯後,在目標路徑下會生成多個文件:
Debug文件夾(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg
*.exe:是生成的可執行文件
*.ilk:當選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息
*.obj:是目標文件,源程序編譯後的產物
*.pch:全稱是PreCompiled Header,就是預先編譯好的頭文件
*.idb:文件保存的信息,使編譯器在重新編譯的時候只重編譯最新改動過的函數和只對最新類定義改動過的源文件進行重編譯,以提高編譯速度
*.pdb:全稱是Program DataBase,即程序資料庫文件,用來記錄調試信息
*.dsp:(全稱是Developer Studio Project)也是一個配置文件
*.ncb:(全稱No Compile Browser)的縮寫,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC開發環境自動生成
*.plg:實際上是一個超文本文件,可以用Internet Explorer打開,記錄了Build的過程
*.cpp:就是C++源代碼文件.
二、具體介紹:
lib是和dll對應的。
lib是靜態的庫文件,dll是動態的庫文件。
所謂靜態就是link的時候把裡面需要的東西抽取出來安排到你的exe文件中,以後運行 你的exe的時候不再需要lib。
所謂動態就是exe運行的時候依賴於dll裡面提供的功能,沒有這個dll,你的exe無法運行。
lib, dll, exe都算是最終的目標文件,是最終產物。而c/c++屬於源代碼。源代碼和最終目標文件中過渡的就是中間代碼obj,實際上之所以需要中間代碼,是你不可能一次得到目標文件。
比如說一個exe需要很多的cpp文件生成。而編譯器一次只能編譯一個cpp文件。
這樣編譯器編譯好一個cpp以後會將其編譯成obj,當所有必須要的cpp都編譯成obj以後,再統一link成所需要exe,應該說缺少任意一個obj都會導致exe的鏈接失敗。
obj里存的是編譯後的代碼跟數據,並且有名稱,所以在連接時會出現未解決的外部符號一說。當連成exe後便不存在名稱的概念了,只有地址。lib就是一堆obj的組合。
2.理論上可以,但實際中通常用lib。
3.編譯器會默認鏈接一些常用的庫,其它的需要你自己指定。
附上lib和DLL的區別
(1)lib是編譯時需要的,dll是運行時需要的。
如果要完成源代碼的編譯,有lib就夠了。
如果也使動態連接的程序運行起來,有dll就夠了。
在開發和調試階段,當然最好都有。
(2)一般的動態庫程序有lib文件和dll文件。
lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。如果有dll文件,那麼對應的lib文件一般是一些索引信息,具體的實現在dll文件中。
如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。
但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。
(3)在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件。
引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址。
這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。
從上面的說明可以看出,DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。
⑺ 對於obj和exe文件,既然都是二進制文件,計算機可以識別,為什麼要進行
obj是源碼編譯文件,而exe是編譯後的解釋生成的文件。
雖然都是二進制文件,但是計算機底層的一些原理導致無法執行obj,
所以需要轉化為exe