【问题标题】:Makefile C++11 error生成文件 C++11 错误
【发布时间】:2013-05-08 15:52:13
【问题描述】:

我正在学习 makefile。我尝试的是在阅读后写自己的。问题是,我总是遇到与 c++11 标准相关的错误,即使我将所需的编译器标志放入 makefile。这是错误:

/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 $@ $(CXX_FLAGS)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
    $(CC)  $< -o $@ $(CXX_FLAGS)

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

请注意,在检查了有关堆栈溢出的其他问题后,我已将 CXX_FLAGS 放入,但无济于事。我仍然得到同样的错误。就像make忽略了我的标志。有解决办法吗?

是的,我可以在不使用 make 的情况下使用 -std=c++0x 标志进行编译,所以我的编译器显然不是问题。

【问题讨论】:

  • make 应该在执行每个命令时打印出它。错误之前的 g++ 调用是什么?
  • @cdhowie g++ -c -o src/normal.o src/normal.cpp 好像忽略了我的flag。
  • 所以问题根本不在于 C++11 标志。您的实际问题是“为什么不使用我的 makefile 规则”。如果是的话,我希望这条线是g++ src/normal.c -o obj/normal.o -std=c++0x
  • 随机猜测:你需要$(CXX_FLAGS) 在$
  • 好吧,我是初学者。谢谢指正。有任何想法吗? @MatsPetersson 不。试过了。

标签: c++ c++11 makefile gnu-make


【解决方案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) $<

这确实需要您使用标准标志变量(即,CXX 而不是 CCCXXFLAGS 而不是 CXX_FLAGS)但无论如何这是个好主意。

【讨论】:

    【解决方案2】:

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

    部分问题在于您用于定义 OBJ 的命令 subst 将其参数解释为文字。改写为

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

    你至少会得到想要的 OBJ。

    【讨论】:

    • 为什么?我该如何改变呢?
    • 定义 OBJ 的行无法正常工作...仍在尝试找出原因
    • 这真的很有趣。这样做之后,我得到: make: *** No rule to make target obj/normal.o', needed by app'。停止。
    【解决方案3】:

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

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

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

    【讨论】:

    • 是的,这是一个关键问题。定义 obj_dir 和 src_dir 中的空格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2011-10-14
    • 2023-03-26
    • 2023-03-19
    相关资源
    最近更新 更多