【问题标题】:CFLAGS are ignored in MakefileCFLAGS 在 Makefile 中被忽略
【发布时间】:2014-10-31 16:37:55
【问题描述】:

我正在使用以下 makefile 来构建我的项目:

CC      = /usr/bin/g++
CFLAGS  = -Wall -pedantic -std=c++0x
LDFLAGS = 

OBJ = main.o pnmhandler.o pixmap.o color.o 

pnm: $(OBJ)
    $(CC) $(CFLAGS) -o pnm $(OBJ) $(LDFLAGS)

%.o: %.c
    $(CC) $(CFLAGS) -c $<

当我运行 make 我得到以下错误:

/usr/include/c++/4.9.1/bits/c++0x_warning.h:32:2: 错误:#error 这个 文件需要对 ISO C++ 2011 的编译器和库支持 标准。此支持目前是实验性的,必须启用 使用 -std=c++11 或 -std=gnu++11 编译器选项。

正如我从以下行中看到的,CFLAGS 没有正确包含,但我不知道我做错了什么:

g++ -c -o main.o main.cpp

也试过-std=c++11-std=gnu++11,没有任何结果。有什么想法吗?

如果我运行make -Bn,我会得到:

g++    -c -o main.o main.cpp
g++    -c -o pnmhandler.o pnmhandler.cpp
g++    -c -o pixmap.o pixmap.cpp
g++    -c -o color.o color.cpp
/usr/bin/g++ -Wall -pedantic -std=c++0x -o pnm main.o pnmhandler.o pixmap.o color.o  

编辑:将规则 %.o: %.c 替换为 %.o: %.cpp 解决了我的问题。

【问题讨论】:

  • 您可以尝试使用-Bn 调用一次make 吗? (试运行,全部重建)
  • 好的...我解决了这个问题。如果我正在处理 C++ 文件,那么规则 %.o: %.c 当然永远不会被调用。对不起。感谢您将我指向make -Bn

标签: c++11 makefile


【解决方案1】:

你看到的原因

g++    -c -o main.o main.cpp

是 Make 正在调用其标准规则来创建目标文件:

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

命令展开为

$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<

不要在你的makefile中设置CCCFLAGS,你应该设置CXXCXXFLAGS,它们是用于C++而不是C的。这允许上面的内置规则为你工作,然后你只需要确保使用正确的链接器,例如与

pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)

您也不需要 %.o: %.c 规则,因为您没有 C 源代码。


完整的 Makefile:

CXX      = /usr/bin/g++
CXXFLAGS = -Wall -pedantic -std=c++0x 

OBJ = main.o pnmhandler.o pixmap.o color.o 

pnm: LINK.o=$(LINK.cc)
pnm: $(OBJ)

clean::
    $(RM) pnm

.PHONY: clean

【讨论】:

  • 正如您在我的问题的 cmets 中看到的,该错误与无效规则有关。您的解决方案是错误的,因为使用的变量也可以命名为 HANNI 和 ANNNI,因为它们被显式使用 ($(CC) $(CFLAGS) -c $&lt;)。
  • 感谢您更新您的答案。接受。
猜你喜欢
  • 2016-04-28
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2022-10-23
  • 2013-04-25
相关资源
最近更新 更多