2014-09-11 56 views
0

我嘗試使用make實用 編譯在我的Linux C程序此發生了什麼事,如果我嘗試創建.o文件將bash中無法執行該文件

#make size_of.o 
cc -c -o size_of.o size_of.c 

正確編譯過程中運行,但當我執行的可執行文件我得到這個錯誤

#./size_of.o 
bash: ./size_of.o: cannot execute binary file 

然後再次運行我沒有做後綴的.o

#make size_of 
cc size_of.o -o size_of 

編譯和執行過程按我的預期運行。

這個程序是否有問題,或者你能告訴我什麼是錯的? 我如何解決這個問題,並在C中的可執行文件之間有任何不同?

此程序:

#include <stdio.h> 

int main (void){ 
printf("char %d bytes\n",sizeof(char)); 
printf("short %d bytes\n",sizeof(short)); 
printf("int %d bytes\n",sizeof(int)); 
printf("long %d bytes\n",sizeof(long)); 
printf("float %d bytes\n",sizeof(float)); 
printf("double %d bytes\n",sizeof(double)); 
printf("long double %d bytes\n",sizeof(long double)); 
return 0; 
} 

,這是輸出:

char 1 bytes 
short 2 bytes 
int 4 bytes 
long 4 bytes 
float 4 bytes 
double 8 bytes 
long double 12 bytes 

回答

4

.o文件對象文件,而不是可執行文件。你已經特別告訴編譯器只創建目標文件,因爲你使用了-c標誌。您不會運行目標文件,它們會將其提供給鏈接器(以及其他內容)以創建可執行文件。

一般(簡體)過程是:

Phase 
----- 
      +---------+ 
      | main.c | (source) 
      +---------+ 
       | 
Compile........|............................ 
       | 
       V 
      +---------+    +-----------+ 
      | main.o | (object)  | libs etc. | 
      +---------+    +-----------+ 
       |       | 
Link...........|.........................|.... 
       |       | 
       +-------------------------+ 
       | 
       V 
      +---------+ 
      | main | (executable) 
      +---------+ 

您解決這個問題通過或者使用打開目標文件轉換成可執行正如您在後面的過程中完成的,但我會做到這一點的:

cc -o size_of size_of.o 

或者乾脆直接從源文件中創建可執行文件:

cc -o size_of size_of.c 

而且,如果您使用的是make,請確保您有實際的Makefile。否則,你會得到可能不是你想要的默認規則。它可以是如此簡單:

size_of: size_of.c Makefile 
    gcc -o size_of size_of.c 
+0

ok那麼如何才能將目標文件轉換爲可執行文件? – harianja 2014-09-11 04:58:12

+0

@harianja,你已經在你的問題中用'cc size_of.o -o size_of'命令完成了這項工作,但我會更新答案以使其更清晰。但是,對於一個簡單的單源文件項目,您不必擔心,只需使用我提供的'gcc -o size_of size_of.c'。 – paxdiablo 2014-09-11 05:09:44

+0

好的paxdiablo 感謝您的幫助 無論如何,我可以有你的電子郵件或Facebook或任何與你連接? – harianja 2014-09-11 05:44:47

0

在第一次make調用中,您將make目標設置爲目標文件(目標具有.o擴展名)。構建目標文件的make規則只是爲了編譯和組裝它們(不鏈接),這就是你得到的目標文件。

第二次調用實際上是要求make構建一個可執行文件。

Gnumake針對不同的目標有一組內置的規則。請參閱此鏈接的詳細信息:

https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html