【问题标题】:Error while compiling with a makefile and c++11使用 makefile 和 c++11 编译时出错
【发布时间】:2016-01-24 20:55:40
【问题描述】:

我目前的 C++ 项目有问题。我需要一些 C++11 提供的工具,但是当我想使用 Makefile 进行编译时,出现错误:

错误此文件需要 ISO C++ 2011 标准的编译器和库支持。此支持目前处于试验阶段,必须使用 -std=c++11 或 -std=gnu++11 编译器选项启用。

这是我的 Makefile :

.PHONY: clean, mrproper

# var
CXX = g++
EXEC = tablut
LDFLAGS = 
CXXFLAGS = -std=c++11 -Wall -Wextra 
SRC= partie.cpp pawn.cpp playground.cpp
OBJ= $(SRC:.c=.o)

# commands
    all: $(EXEC)

tablut: $(OBJ)
    $(CXX) -o tablut $(OBJ) $(LDFLAGS)

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

clean:
    rm -rf *.o

mrproper: clean
    rm -rf tablut

有趣的是,如果我输入命令 g++ -c std=c++11 ... ,我的代码就会编译。

我做错了什么?

注意:我尝试使用标志 -std=c++11、-std=c++0x 和 -std=gnu++11

【问题讨论】:

  • 能否包含运行make的输出?
  • 它怎么能和这个OBJ= $(SRC:.c=.o)一起工作???应该是OBJ= $(SRC:.cpp=.o)
  • @AlexLop.:因为触发的唯一规则是tablut,因为$(OBJ) == $(SRC)
  • @BillLynch 对!接得好。请在您的答案中添加此解释并显示正在执行的实际编译行(并且它不包含-std=c++11

标签: c++ c++11 makefile


【解决方案1】:

你有规则:

OBJ= $(SRC:.c=.o)

这意味着$(OBJ) 最终成为:

OBJ= partie.cpp pawn.cpp playground.cpp

因为它们都不匹配.c。你可能是想写:

OBJ= $(SRC:.cpp=.o)

通过该修复,运行 make 会产生:

$ make
g++ -o partie.o -c partie.cpp -std=c++11 -Wall -Wextra 
g++ -o pawn.o -c pawn.cpp -std=c++11 -Wall -Wextra 
g++ -o playground.o -c playground.cpp -std=c++11 -Wall -Wextra 
g++ -o tablut partie.o pawn.o playground.o 

这可能是你想要的。

【讨论】:

  • 通常,当某些东西不起作用时,是因为一些愚蠢的错误。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多