2013-02-11 35 views
2

我有一個簡單的,有代表性的C程序,保存在一個名爲hello.c如何設置gcc使用文件擴展名(.c或.cpp)來確定正確的編譯器/鏈接器?

#include <stdio.h> 
int main(void) 
{ 
    printf('Hello, world\n'); 
    return 0; 
} 

在我的Linux機器,我試圖用gcc來編譯程序:

gcc hello.c 

返回一個錯誤:

undefined reference to "___gxx_personality_v0" ... etc 

如之前在C++中的上下文beendiscussed有,這個問題在出現當gcc嘗試將C庫鏈接到一個C++程序時,這會產生錯誤。在one of the answers中,有人提到擴展確實是問題,並且gcc在編譯C文件時需要擴展.c,並且在編譯C++文件時需要其他擴展(例如.cpp)。

問題:如何設置gcc使用文件擴展名來確定使用哪個編譯器,因爲gcc似乎默認爲我的系統上的C++?單獨通過文件擴展名指定語言似乎不夠。如果我使用-x標誌指定語言,則gcc按預期運行。

gcc -x c hello.c 

回答

1

通常,你讓make決定這一點。

GNU Make內置了隱式規則,可以自動選擇合適的編譯器。

嘗試在Makefile中使用這些內容:

all: some_file.o some_other_file.o 

,然後將一個some_file.cppsome_other_file.c在同一目錄中,和GNU make會自動選擇正確的編譯器。鏈接器,你可能仍然需要自己提供。當混合C和C++,它通常是最容易使用g ++鏈接,就像這樣:

program.exe: some_file.o some_other_file.o 
    g++ -o [email protected] @^ 

這是一樣的:

program.exe: some_file.o some_other_file.o 
    g++ -o program.exe some_file.o some_other_file.o 
+0

沒有看見你的編輯之前,我貼我的最後意見(這處理make的隱式規則)。我不打算在這個項目中混用C和C++,但這仍然有助於瞭解。 – 2013-02-11 18:33:26

+2

@RicardoAltamirano,我想大約有一百萬SO用戶會回答這個問題,所以我衝上去放了一個佔位符。 :-) – 2013-02-11 18:35:22

+1

哎呀,那很明顯?顯然C不是我的專長。 – 2013-02-11 18:36:19