gpt4 book ai didi

gcc - CFLAGS、CCFLAGS、CXXFLAGS - 这些变量到底控制什么?

转载 作者:行者123 更新时间:2023-12-03 05:32:42 28 4
gpt4 key购买 nike

我正在使用 GNU make 编译我的 C++ 代码,我想了解如何使我的编译可定制。

我在不同的地方读到 CFLAGSCCFLAGSCXXFLAGS 用于此目的。那么我应该如何使用它们呢?如果我有额外的编译器命令行参数,我应该将它们附加到 CFLAGS 还是放在前面?有通用的做法吗?

为什么是三个不同的变量?我想 C 编译器应该得到 CFLAGSCCFLAGS,而 C++ 编译器应该得到 CFLAGSCXXFLAGS - 确实如此我理解对了吗?

人类用户应该设置这些变量吗?是否有任何自动工具(automakeautoconf 等)设置它们?我应该使用的 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 这样的东西。有 CFLAGSCPPFLAGSCXXFLAGSCFLAGS 用于 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com