2013-05-08 98 views
2

我正在学习makefile。我试过的是在阅读一小段文字后写下自己的一本。问题是,即使我把需要的编译器标志放到makefile中,我总会得到与C++ 11标准相关的错误。以下是错误:Makefile C++ 11错误

/usr/include/c++/4.6/bits/c++0x_warning.h:32:2: error: 
#error This file requires compiler and library support for the upcoming 
ISO C++ standard, C++0x. This support is currently experimental, and 
must be enabled with the -std=c++0x or -std=gnu++0x compiler options. 

这里是生成文件:

CC = g++ 
LD = g++ 

NAME = app 
OBJ_DIR = obj 
SRC_DIR = src 

CXX_FLAGS = -std=c++0x 

SRC = $(shell find $(SRC_DIR) -type f -regex ".*\.cpp") 
OBJ = $(subst $(SRC_DIR), $(OBJ_DIR), $(addsuffix .o, $(basename $(SRC)))) 

all: $(NAME) 

$(NAME): $(OBJ) 
    $(LD) $< -o [email protected] $(CXX_FLAGS) 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    $(CC) $< -o [email protected] $(CXX_FLAGS) 

clean: 
    rm $(NAME) $(OBJ_DIR) -rf 

请注意,我已经把CXX_FLAGS检查出的堆栈溢出的其他问题后,但无济于事。我仍然得到同样的错误。这就像make忽略我的国旗。有针对这个的解决方法吗?

是的,我可以用-std = C++ 0x标志编译而不make,所以我的编译器显然不是问题。

+0

'make'应该在执行时输出每条命令。什么'g ++'调用立即出现在错误之前? – cdhowie 2013-05-08 15:54:20

+0

@cdhowie g ++ -c -o src/normal.o src/normal.cpp 它看起来像忽略我的国旗。 – darxsys 2013-05-08 15:55:28

+0

所以这个问题根本不在C++ 11标志中。你的实际问题是“为什么我的makefile规则不被使用”。如果是这样的话,我希望该行是'g ++ src/normal.c -o obj/normal.o -std = C++ 0x' – cdhowie 2013-05-08 15:56:15

回答

1

目录obj是否存在?

一种更好的方式来写,这将是:

OBJ = $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC)) 

您可以将这些行之后添加$(info OBJ = $(OBJ))等打印出来。基本上这些操作的结果与您的模式规则不匹配,因此make使用默认模式规则。

虽然我强烈劝阻这种事(使用find)。我总是输入我想编译的源文件。添加一个新文件的时间不会超过几秒钟,并且可以确保在您最不期望的时候,不会随机向您的程序投掷垃圾。

你的编译命令也是错误的:你忘记了-c这个标志很重要。我建议人们只是用相同的命令作为默认规则(运行make -p -f/dev/null看到默认的规则):

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
     $(COMPILE.cc) $(OUTPUT_OPTION) $< 

这并不需要您使用标准的标志变量(即CXXCCCXXFLAGSCXX_FLAGS ),但无论如何这是个好主意。

+0

Man,this worked.Th对此建议anks !!! – darxsys 2013-05-08 16:41:51

1

它实际上并没有使用你的规则来构建目标文件。注释掉,你会发现它仍然调用“g ++ -c”。

问题的一部分是,用于定义OBJ的命令subst将其参数解释为文字。把它改写为

OBJ = $(subst src, obj, $(addsuffix .o, $(basename $(SRC)))) 

你至少会得到想要的OBJ。

+0

为什么?我该如何改变它? – darxsys 2013-05-08 16:17:59

+0

行定义OBJ不能正常工作......仍然试图弄清楚为什么 – Clark 2013-05-08 16:27:30

+0

这真的很有趣,做完之后,我得到: make:***没有规则可以让目标'obj/normal.o' 'app'。Stop。 – darxsys 2013-05-08 16:39:16

1

在行的末尾有空格,定义了SRC_DIROBJ_DIR。这意味着subst不会做任何事情,因为它正在寻找"src "而不是"src"

反过来,这意味着它将尝试构建src/whatever.o而不是obj/whatever.o,并且由于没有规则,它将回退到默认规则而不是您的规则。

解决该问题后,您需要将-c添加到编译命令中,以生成目标文件而不是可执行文件。

+0

是的,这是一个关键问题。定义obj_dir和src_dir的空间 – darxsys 2013-05-10 21:21:28