【问题标题】:make is not using -std=c++11 option for g++make 没有为 g++ 使用 -std=c++11 选项
【发布时间】:2017-05-22 00:40:08
【问题描述】:

我正在尝试使用 make 编译 c++ 文件。但是,默认情况下它不使用 -std=c++11 标志。每当我需要编译使用 c++11 特定功能的程序时,我必须使用 g++ 显式编译它。

所以,我想问一下如何让系统上的所有 c++ 文件自动使用选项 -std=c++11。

如果我需要为 g++ 更改一些全局 makefile,makefile 在 Linux Mint 18 上的位置是什么,需要更改或添加什么?

或者我需要为自己创建一个 Makefile 吗?

编辑 1: 我正在调用 make like

make myfile

并且目录中只有 .cpp 文件及其二进制文件。我的目录中没有任何 Makefile。

编辑 2:这里,myfile 是我要编译的 c++ 文件的名称。

当我使用 -d 选项运行 make 时,我得到以下输出(我无法粘贴所有输出,因为它很长并且超出了正文大小限制,所以我包括了输出的屏幕截图) . Image 1
而这张图片(2)的末尾有几行。
Image 2

我故意对文件 "MagicalWord.cpp" 进行了更改,以便 make 找到要制作的东西!

【问题讨论】:

  • 你是如何调用 make 命令的,你运行 make 的目录的内容是什么?
  • 什么是我的文件?
  • 如果您使用-d 选项运行make,它将在打印版本信息后打印Reading makefiles... Reading makefile 'Makefile'... 之类的行。它说的是哪个文件?
  • 用相关信息更新问题@taskinoor
  • @ShubhamPrasad 您需要发布您的实际 Makefile,以便人们可以建议在哪里添加 -std=c++11 标志。没有适用于每个平台和 makefile 的通用地方,这完全取决于您如何编写特定 Makefile 的确切细节

标签: c++11 makefile g++


【解决方案1】:

没有“全局 makefile”,也无法更改所有 make 调用的默认标志(除非您将源代码编辑为 GNU make 并自己编译,在这种情况下这是个坏主意)。

在您的 makefile(s) 中,添加以下行:

CXXFLAGS += -std=c++11

假设您使用内置规则进行编译,或者您使用标准变量和自己的规则,这将满足您的需求。

如果这不起作用,我们将需要查看您的 makefile,或者至少查看您用于构建 C++ 源文件的规则(-d 输出之类的东西在这里没有用——如果没有构建您认为应该构建的文件或类似的文件)。

【讨论】:

    【解决方案2】:

    为所有 C++ 项目设置系统范围的语言不一定是个好主意。相反,定义一个 Makefile 来指定您想要的任何编译器选项:

    CXXFLAGS := -std=c++11 $(CXXFLAGS)
    

    然后在编译 C++ 程序时将 CXXFLAGS 传递给您的编译器(假设您使用的是默认的 GNU Make 规则)。

    如果 Makefile 位于您当前的工作目录中,您现在可以运行 make target 以将 target.cpp 文件编译为 target 可执行文件。 如果 Makefile 在另一个目录中,您必须指定它的路径:

    make -f path/to/your/Makefile target
    

    如果只想为一次运行添加额外的参数,可以在命令行设置环境变量或make变量:

    # environment:
    CXXFLAGS='-std=c++11' make target
    
    # make variable:
    make target CXXFLAGS='-std=c++11'
    

    其中任何一个都将导致g++ -std=c++11 target.cpp -o target 或等效的执行。

    理论上,您可以将 shell 配置文件编辑为 export CXXFLAGS='-std=c++11',这将使该环境变量可用于您运行的所有程序。在实践中,通过环境变量设置编译器选项往往会导致比它解决的问题更多。

    在所有这些解决方案中,编写一个普通的 Makefile 是迄今为止最简单的方法。这样一来,所有的构建配置都集中在一个地方并且完全自动化。

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 2015-12-16
      • 1970-01-01
      • 2015-02-15
      • 2021-08-17
      • 2016-07-08
      相关资源
      最近更新 更多