我刚刚通过我的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.
答案 0 :(得分:3)
您正在使用make
的默认规则来构建目标文件。由于您的源文件是C ++(由.cc
扩展名表示),除了CXX
和{{1}之外,您还需要覆盖CXXFLAGS
和CC
个变量您用于链接步骤的变量。像这样的东西应该这样做:
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;可以省略相同的结果。