23

GCC 官方文档中的以下链接:

http://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html

解释以下环境变量:

LANG
LC_CTYPE
LC_MESSAGES
LC_ALL
TMPDIR
GCC_COMPARE_DEBUG
GCC_EXEC_PREFIX
COMPILER_PATH
LIBRARY_PATH
CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH
DEPENDENCIES_OUTPUT
SUNPRO_DEPENDENCIES

但我之前也听说过/读过这些其他编译标志:

  • 用于编译 C 代码:CC,CFLAGS
  • 用于编译 C++ 代码:CXX,CPPFLAGS

并链接标志:

  • 对于链接阶段:LDFLAGS
  • 代码编译后:LD_LIBRARY_PATH

CC, CFLAGS, CXX, 和是什么意思CPPFLAGS?为什么它们不包含在官方环境变量列表中gcc

4

3 回答 3

31

首先,您提到的所有变量:CC, CFLAGS, CXX, CXXFLAGS, LDFLAGS, LD_LIBRARY_PATH, 都源自 Unix OS 家族。这些变量首先与 GCC 无关,这就是为什么您在手册中看不到它们的踪迹。

其中唯一有意义的变量(也与 GCC 没有直接联系)是LD_LIBRARY_PATH. 您可能会发现这个变量在任何现代类 Unix 操作系统上都是开箱即用的。这是Linux Programmer's Manual 中提到的LD.SO(8)LD_LIBRARY_PATH手册页及其用途。这是另外一个摘录:

LD_LIBRARY_PATH环境变量包含一个以冒号分隔的目录列表,动态链接器在查找要加载的共享库时搜索这些目录。

目录按照提及的顺序进行搜索。

如果未指定,则链接器使用默认值,即/lib:/usr/lib:/usr/local/lib.

如您所见LD_LIBRARY_PATH,它只是一个特定于操作系统的环境变量,用于正确加载共享库。Windows 在这方面也有类似的环境变量:PATH. Windows 在搜索动态链接库(DLL,Linux 上的 SO 的对应物)时也会扫描其中列出的目录。

关于其余变量(CC, CFLAGS, CXX, CXXFLAGS, LDFLAGS),由于历史原因,您经常看到它们。自 Unix 时代兴起以来,软件项目都是使用Make构建的(向下滚动并查看典型makefiles 的示例)——这是开创性的构建工具之一。makefile这些变量在s中被如此广泛地使用,以至于最终它们成为一种约定(例如,参见隐式规则)。这就是为什么您甚至可以看到它们在例如 Linux 上开箱即用地定义,并且很可能指向 GCC(因为它被认为是 Linux 的本机工具链)。

总而言之,重点是:不要挠头CCCFLAGS, CXX, CXXFLAGS, LDFLAGS, 和朋友,因为他们只是过去的爆炸;)

奖金


如今,直接使用普通的 Make 直接构建复杂的软件很快变得乏味且容易出错。因此,已经开发了许多复杂的构建系统生成器,例如GNU AutomakeCMake 。简而言之,他们的目标是提供(可以说)更易读、更易于维护和高级语法来为要构建的任意软件项目定义任意复杂的构建系统。通常,在实际构建项目之前,必须生成一个原生构建系统(也可以用普通的旧makefiles,例如,出于可移植性的原因,但不一定)使用相应的工具集脱离此高级定义。最后,必须使用与生成的(本机)构建系统相对应的工具来构建项目(例如,在普通旧makefile的情况下使用 Make,但不一定)。

既然您在问这些问题,我怀疑您即将开始使用 C 或 C++ 进行本机软件开发。如果是这样,我强烈建议您首先选择一个现代构建系统(CMake 是我个人的建议),使用它并学好它。

于 2013-04-16T21:36:37.070 回答
1

简单来说 CC,CFLAGSLDFLAGS是 gnu Makefile 变量。如果已定义,即使没有在命令/规则中实际提及,这些也会被隐式规则使用

于 2016-08-10T03:34:35.113 回答
1

您绝对可以将环境变量与 GCC 一起用于 CFLAGS 和 CC(以及其他任何东西)。您只需将变量传递到编译行,根据操作系统略有不同。

Linux设置CFLAGS环境变量:

export CFLAGS="-g -Wall -std=c89 -pedantic"

使用 CFLAGS 在 Linux 上编译

gcc $CFLAGS - o progname progname.c

Windows 设置 CFLAGS 环境变量:

set CFLAGS=-g -Wall -std=c89 -pedantic

使用 CFLAGS 在 Windows 上编译

gcc %CFLAGS% - o progname progname.c

您甚至可以在变量中设置一个临时编译字符串,并在测试时调用它进行编译。

set BUILD=gcc -g -Wall -std=c89 -pedantic - o progname progname.c

并称它为...

%BUILD%

在 Linux 上设置和使用变量时要记住的一件事(正如大多数程序员所知道的),变量区分大小写,因此 $cflags 将被简单地忽略。在 Windows 上无关紧要。

在这两个系统上,上述内容仅在终端(或命令提示符)会话终止之前有效。要使它们永久化,您需要在它们各自的设置文件中设置变量。

于 2021-09-17T19:29:20.427 回答