似乎make忽略了我的cflag选项,因为编译器抱怨我需要将-std = c 11作为标志,但该选项包含在我的makefile中.
CC=g++
# Flags for the C compiler
CXX_FLAGS= \
    -Wall \
    -std=c++11 \
    -O2
# Linker Flags
LD_FLAGS= 

# Sources to compile
SOURCES=main.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXE=HolidayLights.out

all: $(SOURCES) $(EXE)

# Primary build target
$(EXE): $(OBJECTS)
    $(CC) $(LD_FLAGS) $(OBJECTS) -o $@

.o:
    $(CC) -c $(CXX_FLAGS) -o $@ $<

此makefile的构建命令的输出是:

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

我不明白为什么它没有在输出中列出我的标志.此外,我知道它忽略了-std = c 11标志,因为它抱怨非静态常量成员,并且它不应该启用该标志.

Edit0:符号更改

解决方法

您的.o:规则未被选中,请将其更改为.cpp.o:相反.

默认情况下(来自GNU make doco):

n.o is made automatically from n.cc,n.cpp,or n.C with a recipe of the form '$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c'

您的规则在第一种情况下不起作用的原因是单后缀隐式规则应该是源类型而不是目标类型.因此规则将是.cpp :(再次,来自make doco):

A double-suffix rule is defined by a pair of suffixes: the target suffix and the source suffix. It matches any file whose name ends with the target suffix. The corresponding implicit prerequisite is made by replacing the target suffix with the source suffix in the file name. A two-suffix rule whose target and source suffixes are '.o' and '.c' is equivalent to the pattern rule '%.o : %.c'.

A single-suffix rule is defined by a single suffix,which is the source suffix. It matches any file name,and the corresponding implicit prerequisite name is made by appending the source suffix. A single-suffix rule whose source suffix is '.c' is equivalent to the pattern rule '% : %.c'.

但是,仔细阅读最后一句话.只有在想要将XYZZY.cpp转换为XYZZY时,.cpp:规则才有效.由于您的目标是XYZZY.o形式,因此不会使用它.

当然,另一种选择是根本不触及默认规则,而只是修改它们使用的变量:

CXX      = g++
CPPFLAGS = -Wall -std=c++11 -O2
LD_FLAGS =

SOURCES  = main.cpp
OBJECTS  = $(SOURCES:.cpp=.o)
EXE      = HolidayLights.out

all: $(SOURCES) $(EXE)

$(EXE): $(OBJECTS)
    $(CXX) $(LD_FLAGS) $(OBJECTS) -o $@

而且,如果您想使用隐式规则,您应该使用首选表单,这是较新的模式规则.它们比后缀更强大.

c – Makefile似乎忽略了标志.为什么?的更多相关文章

  1. 如何在卸载自建包后不使用/usr/local/lib?

    现在我使用sudomakeuninstall卸载了pcl-1.12,并希望使用默认的pcl-1.10。但当我编译项目时,错误消息显示即使我卸载了包,PATH仍然指向/usr/local/lib。有没有方法可以将PATH重置为全局包路径?对于这种情况,我认为pcl-1.10的libpcl_surface.so在/usr/lib/x86_64-linux-gnu/libpcl_outofcore.so中。我正在研究ROS2,并使用colcon编译CMakeList.txt。所以我不能修改makefile。一种

  2. Ubuntu 16.06 + Opencv3.2解决办法 Makefile:160: recipe for target 'all' failed

    注:opencv编译失败之后,其前面肯定有失败报错的地方,也就是解决问题和核心了,如上图中最后报错“Makefile:160:recipefortarget‘all’Failed”无法锁定问题在那儿,往上翻番看就能发现问题的原因,在继续解决就行了。解决方案通过一股查找之后,在博主中找到答案。

  3. Ubuntu下eclipse编译调试带makefile的c++项目源码

    新建c++项目,File-New-C++Project,projectname随意填,在Projecttype里面选择Makefileproject-EmptyProject,右边选LinuxGCC,finish。建好c++项目后,将下载下来的带makefile的c++源码下所有文件复制到新建c++项目目录下,选中项目F5刷新,打开makefile文件,若要调试代码,则需在编译的时候添加参数-g,然后点击菜单栏project-BuildAll,便会自动按照源码的makefile文件定义的规则进行编译,编译

  4. Ubuntu16.04安装RTEMS4.12-4.11 RSB及BSP

    出处一定要多读文档!!!

  5. 正则表达式中的$ 遇到makefile

    今天再写一个makefile时clean-temp:rm`ls-a|grep~$`想要完成删除所有以~结尾的临时文件但是这样写不能完成,只能在terminal当中完成会提示这样的错误:/bin/sh:-c:line0:unexpectedEOFwhilelookingformatching``'/bin/sh:-c:line1:Syntaxerror:unexpectedendoffileMake

  6. 【ARM】Ubuntu下使用eclipse创建交叉编译项目

    交叉编译项目中最重要的就是交叉编译工具链和Make环境的设置,因为eclipse的设置项非常多,所以本片教程旨在快速建立交叉编译项目。这一步非常重要,Crosscompilerprefix是你的交叉编译器的前缀名,Crosscompilerpath是你的交叉编译工具链的可执行文件所在的目录。其他设置设置字符编码,将字符编码设置为GBK,这样可以方便的在Windows和Ubuntu之间传输项目。

  7. ubuntu系统下通过源码安装程序configure,make,make install

    configure执行后将生成MakeFile文件。ln-s/usr/local/Nginx/include/usr/include/yourname4、可能程序还提供了帮助文档,一般是安装目录下的man目录,为了我们可以使用man命令查看我们程序的帮助文档,我们需要:在/etc/man.config中添加一条MANPATH,指向我们的文档目录configure/make/makeinstall的作用这些都是典型的使用GNU的AUTOCONF和AUTomake产生的程序的安装步骤。来进行一些测试),这一步

  8. ubuntu下使用VScode打开本地使用makefile编译的工程包括命令行参数的配置

    调用可执行程序执行代码快捷键:ctrl+shift+D或者是点击左侧的第三个图标点击设置图标,选择上面安装的扩展C++此时会自动生成两个文件:launch.json以及setings.json,接下来对launch.json进行编辑:这一步的操作默认已经有了可执行程序,可能是我们在命令行中自己make生成的,接下来介绍一下怎么基于VScode调用make命令生成可执行程序。

  9. 如何在Windows中运行makefile

    我有文件夹包含文件:如何运行makefile?

  10. Ubuntu16:cmake生成Makefile编译caffe过程(OpenBLAS/CPU+GPU)塈解决nvcc warning:The 'compute_20', 'sm_20'

    之前在ubuntu14下实现了Caffe编译。最近将系统升级到ubuntu16,新电脑显示也支持CUDA了,重新编译Caffe时发现还依赖库还是有点不同,在这里记下来。

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部