2013-10-08 37 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