2013-10-08 92 views
2

我剛剛在我的OSX(Snow Leopard)機器上通過brew安裝了gcc 4.8。使用混合版本的gcc的Makefile

當我運行使它的舊版本的g ++的對象文件和新版本的可執行文件。

$ make 
g++ -c -o myprogram.o myprogram.cc 
g++-4.8 -g -Wall -o myprogram myprogram.o 

我敢肯定這是一個簡單的東西在我的Makefile中,任何人都可以幫我糾正這個問題嗎?

的Makefile:

CC  := g++-4.8 
CFLAGS := -g -Wall 

SRCS  := myprogram.cc 
OBJS  := ${SRCS:.cc=.o} 
TARGET := ${SRCS:.cc=} 

default: all 

all: $(OBJS) 
    $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) 

下面是版本信息:

$ g++ --version 
i686-apple-darwin10-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00) 
Copyright (C) 2007 Free Software Foundation, Inc. 

$ g++-4.8 --version 
g++-4.8 (GCC) 4.8.1 
Copyright (C) 2013 Free Software Foundation, Inc. 

回答

3

您使用make的默認規則,以建立自己的目標文件。由於您的源文件是C++(如.cc擴展名所示),除了您用於鏈接步驟的CCCFLAGS變量之外,您還需要覆蓋CXXCXXFLAGS變量。像這樣的東西應該這樣做:

所有make文件的
CXX := $(CC) 
CXXFLAGS := $(CFLAGS) 
+0

正是我期待的!謝謝。 – MERM

2

首先似乎是不正確的,只能是因爲你有一個源文件。當您嘗試向SRCS添加更多文件時,它會中斷(在-o後會傳遞乘法參數)。通常你明確地指定TARGET作爲程序名,而不是沒有擴展名的源文件。 您只指定了一個規則來鏈接可執行:

all: $(OBJS) 
    $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) 

這也並不正確,應該是:

$(TARGET): $(OBJS) 
    $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) 

可以在所有加入的依賴:

all: $(TARGET) 

現在您沒有指定如何從.cc文件構建規則,但make很聰明,可以爲您提供隱式規則。但對於C++程序,使用CXX變量,而不是CC(你也應該遵循這個),這就是爲什麼你在編譯時沒有g ++-4.8。因此,更多的正確的文件看起來是這樣的:

CXX  := g++-4.8 
CXXFLAGS := -g -Wall 

SRCS  := myprogram.cc 
OBJS  := ${SRCS:.cc=.o} 
TARGET := myprogram 

.PHONY: default all 

default: all 

all: $(TARGET) 

$(TARGET): $(OBJS) 
    $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJS) 

%.o: %.cc 
    $(CXX) $(CXXFLAGS) -c -o [email protected] $< 

%的.o:%.c的可能不是必要的,但展示如何規則隱含工作。明確提供它不會傷害。

PS我添加了顯式的-o參數到最後一條規則。我只是使用了g ++默認生成.o文件的事實,並且可以省略「-o filename.o」並獲得相同的結果。

+0

擁有'default'規則有什麼意義?你能不能把所有的都當成第一條規則? – DanielKO

+0

謝謝,我用你的例子來清理我的makefile。 – MERM

+0

@Slava雖然在更改之前(但修復CXX問題之後),可能會爲目標文件執行此操作: '$ make g ++ - 4.8 -g -Wall -c -o myprogram.o myprogram.cc G ++ - 4.8 -g -Wall -o myprogram myprogram.o' 現在它的作用: '$使 G ++ - 4.8 -g -Wall -c myprogram.cc G ++ - 4.8 -g -Wall -o myprogram myprogram 。['我不知道如何格式化,以便換行符] – MERM