【问题标题】:Got "-std=c++11: command not found" error when trying to compile a object file using g++尝试使用 g++ 编译目标文件时出现“-std=c++11: command not found”错误
【发布时间】:2017-01-07 17:19:40
【问题描述】:

如标题所示,当我尝试通过运行此 shell 脚本使用 g++ 编译目标文件时:

#!/bin/bash
name=textsweeper
srcdir=src
buildir=build
cc=g++
cppflags=-Wall -std=c++11 -ggdb -O
libs=
rm -f $buildir/$name $buildir/main.o
$cc $cppflags $srcdir/main.cpp -c -o $buildir/main.o
$cc $buildir/main.o $libs -o $buildir/$name

我收到以下错误:

$ bash compile
compile: line 6: -std=c++11: command not found

还有其他关于仅在 stdc++11 中可用的东西的错误。 我试过雅虎错误,但我只得到关于实际命令而不是参数的错误的答案。

【问题讨论】:

  • 顺便说一下,考虑使用 GNU Make 之类的东西。
  • @LightnessRacesinOrbit 我试过了,但我认为 Makefile 过于复杂。
  • 在您的项目中添加少量内容后,不会像这个 shell 脚本那样过于复杂。
  • @digitcrusher 是的,它们对于非平凡的项目来说过于复杂了。不久之后,您的 bash 脚本也会出现同样的情况。您不想手动编写此类文件。您想自动生成它们。查看CMake 了解在 C++ 世界中广泛使用的构建系统。

标签: c++ linux bash variables gcc


【解决方案1】:

变量赋值是空间敏感的。变化:

cppflags=-Wall -std=c++11 -ggdb -O

到

cppflags="-Wall -std=c++11 -ggdb -O"

否则,您将尝试在包含cppflags=-Wall 设置的环境中运行命令-std=c++11 -ggdb -O。 bash 允许以这种方式完成临时环境设置,这就是为什么引用任何包含空格的变量赋值很重要。

【讨论】:

  • 谢谢您,非常感谢您的回答。现在,当我运行脚本时,我的控制台中不会出现“-std=c++”错误。
  • 致 OP:您应该已经能够解决问题所在。该行已明确标记为问题,并且错误消息告诉您 bash 正在尝试将 -std=c++11 作为命令运行。
  • @MartinBonner 假设您知道命令可以在变量赋值之前。否则,为什么 shell 会认为 std=c++11 是要运行的命令的名称可能并不明显。
  • @chepner:是的,我不怪 OP 不知道这一点。在我了解这种行为之前,我使用 bash 已经有五年了(以前,在运行依赖于它们的子命令之前,我总是只使用 exported 名称)。仅仅因为现在对我来说很明显并不意味着这是一个简单的问题。
  • @chepner 不,实际上我并没有假设 op 知道命令可以在分配之前。我只是假设他可以看到作业在第一个空格处被拆分 - 所以他需要引用作业。
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2020-09-26
  • 2012-09-27
  • 2014-08-27
  • 2013-01-25
相关资源
最近更新 更多