Makefile使用混合版本的gcc

时间:2013-10-08 17:55:55

标签: c++ gcc makefile

我刚刚通过我的OSX(Snow Leopard)机器上的brew安装了gcc 4.8。

当我运行make时,它使用旧版本的g ++作为目标文件,使用新版本作为可执行文件。

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

我确信在我的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.

2 个答案:

答案 0 :(得分:3)

您正在使用make的默认规则来构建目标文件。由于您的源文件是C ++(由.cc扩展名表示),除了CXX和{{1}之外,您还需要覆盖CXXFLAGSCC个变量您用于链接步骤的变量。像这样的东西应该这样做:

CFLAGS

答案 1 :(得分:2)

首先,你的make文件似乎不正确,只有你有一个源文件才有效。当您尝试向SRCS添加更多文件时,它将中断(在-o之后将传递多个参数)。通常您将TARGET明确指定为程序名称,而不是没有扩展名的源文件。 您只指定了一个规则来链接可执行文件:

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

这也不太正确,应该是:

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

您可以添加所有依赖项:

all: $(TARGET)

现在你没有指定如何从.cc构建.o文件的规则,但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 $@ $<

%。o:%。c可能没有必要,但显示隐式规则的工作原理。明确地提供它不会有害。

PS我在最后一条规则中添加了显式-o参数。我只是使用了g ++默认生成.o文件和&#34; -o filename.o&#34;可以省略相同的结果。