【问题标题】:makefile for c++11 doesn't workc ++ 11的makefile不起作用
【发布时间】:2016-04-05 10:20:40
【问题描述】:

我是 makefile 的新手。我创建了以下makefile:

CC=g++
DEBUG= -g
CFLAGS=-c -Wall -std=c++11 $(DEBUG)

all: hello

hello: ConsoleApplication1.o clock.o communication.o device_manager.o devices.o 
    $(CC) ConsoleApplication1.o clock.o communication.o device_manager.o devices.o 

ConsoleApplication1.o: ConsoleApplication1.cpp
        $(CC) $(CFGLAS) ConsoleApplication1.cpp

clock.o: clock.cpp clock.h
        $(CC) $(CFGLAS) clock.cpp

communication.o: communication.cpp 
        $(CC) $(CFGLAS) communication.cpp

device_manager.o: device_manager.cpp 
        $(CC) $(CFGLAS) device_manager.cpp

devices.o: devices.cpp 
        $(CC) $(CFGLAS) devices.cpp

clean:
    rm -rf *.o hello

我把makefile放在所有代码文件的目录下,从命令行运行“make”命令。

我遇到了很多错误,例如:

ConsoleApplication1.cpp:494:30:错误:“chrono”不是“std”的成员 mytime::duration_timer_t 计时器; ^ ConsoleApplication1.cpp:494:30:错误:‘chrono’不是‘std’的成员 ConsoleApplication1.cpp:494:55:错误:模板参数 1 无效 mytime::duration_timer_t 计时器; ^ ConsoleApplication1.cpp:494:65:错误:“;”标记之前的声明类型无效 mytime::duration_timer_t 计时器; ^ ConsoleApplication1.cpp:495:11: 错误:在‘timer’中请求成员‘set_duration’,它是非类类型‘int’ timer.set_duration(std::chrono::seconds(120)); ^ ConsoleApplication1.cpp:495:29:错误:'std::chrono' 尚未声明 timer.set_duration(std::chrono::seconds(120)); ^ ConsoleApplication1.cpp:496:16: 错误:在‘timer’中请求成员‘start’,它是非类类型‘int’ for(timer.start(); not(timer.expired());)

当我在 codeBlocks 中编译完全相同的文件代码时,它会编译,所以我猜我在 make 文件中有一些错误。 我的项目名称“general.h”中有一个头文件,它没有 cpp 文件。我应该把它也放在makefile中吗?

【问题讨论】:

  • 在您的hello 标签中,您正在尝试编译.o 文件。
  • -std=c+11 应替换为 -std=c++11
  • @Aleph0 我在我的 makefile 中做同样的事情...它们生成 .o 文件很好。
  • @Aleph0- 应该是这样的。 (例如youtube.com/watch?v=aw9wHbFTnAQ
  • 我认为您还应该在某处添加指令-o hello 以创建可执行文件

标签: c++ c++11 makefile


【解决方案1】:

你的规则是$(CFGLAS),而不是$(CFLAGS)

这意味着 -std=c++11 永远不会传递给编译器,因此 C++11 功能不适合您。

更注重细节!

您还需要在您的hello 规则中将$(CFLAGS) 传递给$(CC),否则您的编译器调用将不同步并且所有的地狱都可能崩溃。

【讨论】:

  • @BarryTheHatchet- 谢谢!现在它编译了。您能否解释一下答案中的最后一部分。我如何将 $(CFLAGS) 传递给 $(CC) ?
  • @sara8:和你在所有其他目标中所做的一样。
  • @BarryTheHatchet- 没有 cpp 文件 (general.h) 的文件怎么办。我应该包括它吗?
  • @sara8:你认为你应该包括它吗?如果是这样,为什么?如果没有,为什么不呢?
  • @ BarryTheHatchet- 我认为它应该是因为编译器应该检查所有文件,但我可以看到 o 文件仅用于 cpp 文件......所以我很困惑。
【解决方案2】:

当您使用-std=c++11编译您的目标文件时,您可以在没有该标志的情况下链接它们。您是否尝试将-std=c++11 添加到hello 规则?

【讨论】:

  • 链接器不需要了解 C++(除了要链接的库)
  • “除了要链接的库”很重要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2015-02-15
  • 2012-11-29
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多