- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 GNU make 编译我的 C++ 代码,我想了解如何使我的编译可定制。
我在不同的地方读到 CFLAGS
、CCFLAGS
和 CXXFLAGS
用于此目的。那么我应该如何使用它们呢?如果我有额外的编译器命令行参数,我应该将它们附加到 CFLAGS 还是放在前面?有通用的做法吗?
为什么是三个不同的变量?我想 C 编译器应该得到 CFLAGS
和 CCFLAGS
,而 C++ 编译器应该得到 CFLAGS
和 CXXFLAGS
- 确实如此我理解对了吗?
人类用户应该设置这些变量吗?是否有任何自动工具(automake
、autoconf
等)设置它们?我应该使用的 Linux 系统没有定义任何这些变量 - 这是典型的吗?
目前我的 Makefile 看起来像这样,我觉得它有点脏:
ifdef code_coverage
GCOV_FLAG := -fprofile-arcs -ftest-coverage
else
GCOV_FLAG :=
endif
WFLAGS := -Wall
INC_FLAGS := -Istuff -Imore_stuff -Ietc
CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)
... (somewhere in the makefile, the command-line for compilation looks like this)
$(CC) $(CCFLAGSINT) -c $< -o $@
... (somewhere in the makefile, the command-line for linking looks like this)
$(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@
我很确定这里没有错误; Makefile 工作得很好。但是是否有任何违反约定的内容(例如 CCFLAGSINT
- 我应该覆盖 CCFLAGS
吗?或者 CXXFLAGS
?FUD!)
抱歉问了这么多问题;您显然不会回答所有问题,但我希望答案将帮助我理解这些设置背后的总体思路。
最佳答案
正如您所注意到的,这些是 Makefile {宏或变量},而不是编译器选项。他们实现一套约定。 (宏是它们的旧名称,仍然被一些人使用。GNU make doc 称它们为变量。)
名称重要的唯一原因是默认的 make 规则,通过 make -p
可见,它使用了其中的一些规则。
如果您编写自己的所有规则,则可以选择所有自己的宏名称。
在普通的 gnu make 中,没有 CCFLAGS 这样的东西。有 CFLAGS
、CPPFLAGS
和 CXXFLAGS
。 CFLAGS
用于 C 编译器,CXXFLAGS
用于 C++,CPPFLAGS
用于两者。
为什么两者中都有CPPFLAGS
?按照惯例,它是预处理器标志(-D
、-U
)的所在地,c 和 c++ 都使用它们。现在,每个人都想要相同的 c 和 c++ 定义环境的假设可能是有问题的,但却是传统的。
附注正如 James Moore 所指出的,某些项目使用 CPPFLAGS 作为 C++ 编译器的标志,而不是 C 预处理器的标志。 Android NDK 就是一个巨大的例子。
关于gcc - CFLAGS、CCFLAGS、CXXFLAGS - 这些变量到底控制什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541946/
我正在尝试使用两个文件编译 NodeJS native 模块:1 个 .c 文件和 1 个 .cpp 文件。这是我的“wscript”文件的样子: def set_options(opt): op
我正在尝试将 Make 项目转换为 Bazel。目前,makefile 检测正在使用的编译器并相应地设置某些 CXXFLAGS(并非所有编译器都能理解所有标志)。 例如: ifeq ($(shell
我正在使用 GNU make 编译我的 C++ 代码,我想了解如何使我的编译可定制。 我在不同的地方读到 CFLAGS、CCFLAGS 和 CXXFLAGS 用于此目的。那么我应该如何使用它们呢?如果
我正在使用GNU make来编译我的C++代码,并且我想了解如何使我的编译可定制。 我在不同的地方阅读了CFLAGS,CCFLAGS和CXXFLAGS用于此目的。那么我应该如何使用它们呢?如果我对编译
在 dirA/SConscript 中我有: Import('env') probeenv = env.Clone() probeenv['CXXFLAGS'] += ['-fno-rtti','-
我已经阅读了一些安装,我需要正确设置环境变量LDFLAGS、LD_LIBRARY_PATHS和CXXFLAGS才能运行./compile.sh。但是,我不确定在那里提供什么路径。有人可以解释一下这些标
我最近正在构建一个新的 NS3 模块。在我的代码中,我使用了 C++11 (c++0x) 的一些新特性,我想添加一个 gcc flags (CXXFLAGS) "-std=c++0x " 到 waf
我想在 Golang 中调用 C 代码: // #cgo CFLAGS: -I/usr/include/c++/8.1.1/bits // #cgo CXXFLAGS: -std=gnu++11 //
在我的机器上,variant=release 的 cxxflags 默认为 -O3。 我需要将其更改为-O2。 请告知如何进行。 如果有人可以就此提出建议,我也可以定义新的变体。 最佳答案 只需使用:
典型的 makefile 通常使用内置变量 CFLAGS、CXXFLAGS、CPPFLAGS 等1设置传递给 C、C++ 或其他编译器/工具的标志。原则上,有时这甚至可以让您完全避免编写编译配方,因为
在编译我的 C++ 程序之前,我从命令行exported CXX 和 CXXFLAGS。 $ export CXX="/media/space/gcc-dist/bin/g++" $ export C
我想在 Rcpp 项目的 Makevars 中将 C++ 编译器标志设置为 -O0。 如果我看一下/etc/R/Makeconf,我发现编译命令似乎是 $(CXX) $(ALL_CPPFLAGS) $
我尝试构建的项目有默认标志 CFLAGS = -Wall -g -O2 CXXFLAGS = -g -O2 我需要向这两个变量附加一个标志 -w (以删除:“将所有警告视为错误”) 我有一个方法可以解
我需要使用 bjam 添加编译器标志。因此,要么我需要一种方法来附加到现有标志——比如 CXXFLAGS+=whatever using gmake——要么我需要知道 cxxflags 当前使用的值,
首先这里的Makefile有 CFLAGS = -g -Wall -lm 那时候我在玩C。现在我在 C++ 上,我必须添加 -I eigen,快速谷歌一下,发现 CXXFLAGS 存在于 C++
是否有强制生成的 makefile 读取 CXXFLAGS 的选项?和 CFLAGS变量并像大多数makefile一样使用它们? 最佳答案 Eclipse CDT 生成的 makefile 包含以下几
我只想调试在 Linux 上运行的一些代码,并且需要调试版本 ( -O0 -ggdb )。所以我将这些东西添加到我的 CMakeLists.txt 中 文件: set(CMAKE_BUILD_TYPE
GNU Make 中的 CPPFLAGS 和 CXXFLAGS 有什么区别? 最佳答案 CPPFLAGS 应该是 C PreP 处理器的标志; CXXFLAGS 用于 C++ 编译器的标志。 make
我有一个项目有一些要求,其中之一是设置 c++11 编译器/链接器标志: jamroot.jam: project : requirements clang:"-stdlib=li
我真的需要一些基本问题的帮助。我即将永远放弃学习 GCC,因为基础知识对我来说似乎没有意义。我已经阅读了数百篇文章,但无法弄清楚如何通过 configure 获得基本的 -std=c++11 工作调用
我是一名优秀的程序员,十分优秀!