2013-10-08 3 views
2

Я только что установил gcc 4.8 через заваривание на моей машине OSX (Snow Leopard).Makefile с использованием смешанных версий gcc

Когда я запустил, он использует старую версию 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 «s правила по умолчанию для создания ваших объектных файлов. Поскольку ваш исходный файл является C++ (как указано расширением .cc), вам необходимо переопределить переменные CXX и CXXFLAGS в дополнение к переменным CC и CFLAGS, которые вы используете для этапа ссылки. Что-то вроде этого должно это сделать:

CXX := $(CC) 
CXXFLAGS := $(CFLAGS) 
+0

Только то, что я искал! Благодарю. – MERM

2

Прежде всего ваш файл make кажется неправильным и работает только потому, что у вас есть один исходный файл. Когда вы попытаетесь добавить больше файлов в SRCS, он сломается (будут переданы множители параметров после -o). Обычно вы указываете TARGET явно как имя программы, а не исходные файлы без расширения. Вы указали только одно правило, чтобы связать свой исполняемый файл:

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

Что тоже не совсем правильно, он должен быть:

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

Вы можете добавить зависимость от всего:

all: $(TARGET) 

Теперь вы не указали правило о том, как создать файл .o из .cc, но make достаточно умный, чтобы иметь неявное правило для вас. Но для C++-программ make использует переменную 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

Спасибо, я использовал ваш пример, чтобы очистить мой файл. – MERM

+0

@Slava Вопрос, однако, перед вашими изменениями (но после исправления проблемы CXX) make сделает это для объектного файла: '$ make g ++ - 4.8 -g -Wall -c -o myprogram.o myprogram.cc г ++ - 4,8 -g -o -Wall MyProgram myprogram.o' теперь делает: '$ сделать г ++ - 4,8 -g -c -Wall myprogram.cc г ++ - 4,8 -g -o -Wall MyProgram MyProgram ,o' [хорошо, я не знаю, как отформатировать это так, чтобы работа новой строки] – MERM

Смежные вопросы