C ++ Makefile g ++和" std ="国旗似乎不起作用

时间:2016-12-08 17:16:10

标签: c++ c++11 makefile

我试图找出makefile并且已经有一个项目目录,我想测试它。可悲的是,我似乎无法满足编译器的需求。 g ++警告我,我需要-std=c++11标志,并进一步将错误打印到C ++ 11相关功能(如线程)。 我不知道自己做错了什么。

以下是第一行错误:

make
g++    -c -o Graphics.o Graphics.cpp
In file included from /usr/include/c++/5/thread:35:0,
                 from Graphics.h:4,
                 from Graphics.cpp:1:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support \
  ^
In file included from Graphics.cpp:1:0:

这里是Makefile:

csrc=$(wildcard *.c)
cppsrc=$(wildcard *.cpp)
obj=$(cppsrc:.cpp=.o) $(csrc:.c=.o)

CXXC = g++
#CXXCFLAGS = -std=c++14
EXEC = myprog

LOPENGL = -lGLEW -lGLM
LSFML = -lsfml-graphics -lsfml-window -lsfml-system
LDFLAGS = $(LSFML) $(LOPENGL)

all: $(obj)
    $(CXXC) -std=c++11 $^ $(LDFLAGS) -o $(EXEC)

.PHONY: clean
clean:
    rm .f $(obj)

我无法理解。互联网只是说"那么,添加标志然后"当我搜索错误。 我已经尝试过了:

  • 切换旗帜的位置或直接在该行中书写(您可以通过评论CXXCFLAGS实际看到这一点。)

  • 使用不同的标记-std=c++11-std=gnu++11-std=c++14

我还注意到编译器运行时没有显示标志(要查看错误的第二行)。

另外,如果你能指出格式,其他错误或传统事物的任何问题,请务必留下评论,我渴望改进。

2 个答案:

答案 0 :(得分:5)

你注释掉了相关的一行:

#CXXCFLAGS = -std=c++14

删除评论以使其有效。此外,变量拼写错误。它们的实际名称是CXXCXXFLAGS(没有尾随/间歇C!)。

您可能还需要指定处理C ++文件:

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -o $@ $<

解释错误:以下规则

all: $(obj)
    $(CXXC) -std=c++11 $^ $(LDFLAGS) -o $(EXEC)

没有编译代码。相反,它链接 - 已编译的 - 对象文件(这是$(obj)所指的)。但是要获取这些目标文件,需要编译源文件,make正在使用implicit rule for .o files

- Makefile中有更多错误。例如,clean规则应调用rm -f而不是rm .f。在编写代码时,你需要更加细致 。

答案 1 :(得分:0)

Konrad's answer解释了为什么你的g++命令没有按照你想要的论点执行。

您可以使用make --print-data-base来帮助您了解Make内置的规则。这里的相关内容是

  • %.o: %.cpp
    #  recipe to execute (built-in):
        $(COMPILE.cpp) $(OUTPUT_OPTION) $<
    

    这是从*.cpp源文件生成目标文件的规则。根据{{​​1}}的定义,我们发现它回到了

    COMPILE.cpp

    所以我们只需要将我们的选项添加到COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c (不是CXXFLAGS - 那是C预处理器,并与C语言共享):

    CPPFLAGS
  • CXXFLAGS += -std=c++14
    

    这是我们要复制的链接步骤,作为从目标文件生成可执行文件的命令。

还有其他几点需要注意:

  • 您的%: %.cc # recipe to execute (built-in): $(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@ 目标永远不会创建名为all的文件,因此即使可执行文件是最新的,也会发生链接步骤。
  • 您忘记启用all进行您一直想要的诊断。
  • 您的-Wall目标有拼写错误clean,并且不会清除不再包含相应源文件的对象文件(即删除源时)。
  • 我通常也会-f删除编辑器备份文件。

这是我改进的makefile版本:

clean