[英]Makefile using mixed versions of gcc
我剛剛在OSX(雪豹)計算機上通過brew安裝了gcc 4.8。
當我運行make時,它將舊版本的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.
您正在使用make
的默認規則來構建目標文件。 由於源文件是C ++(如.cc
擴展名所示),因此除了用於鏈接步驟的CC
和CFLAGS
變量外,您還需要覆蓋CXX
和CXXFLAGS
變量。 像這樣的事情應該做到這一點:
CXX := $(CC)
CXXFLAGS := $(CFLAGS)
首先,您的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(也應遵循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文件,並且可以省略“ -o filename.o”,結果相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.