簡體   English   中英

使用gcc混合版本的Makefile

[英]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擴展名所示),因此除了用於鏈接步驟的CCCFLAGS變量外,您還需要覆蓋CXXCXXFLAGS變量。 像這樣的事情應該做到這一點:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM