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
但我之前也听过/读过这些其他编译标志:
CC
,CFLAGS
CXX
,CPPFLAGS
连接标志:
LDFLAGS
LD_LIBRARY_PATH
CC
,CFLAGS
,CXX
和CPPFLAGS
的含义是什么?为什么它们不包含在gcc
的官方环境变量列表中?
答案 0 :(得分:21)
首先,您提到的所有变量:CC
,CFLAGS
,CXX
,CXXFLAGS
,LDFLAGS
,LD_LIBRARY_PATH
,源自Unix OS系列。这些变量首先与GCC无关,这就是为什么你在手册中看不到它们的痕迹。
其中唯一有意义的变量(与GCC没有直接联系)是LD_LIBRARY_PATH
。你可能会发现这个变量可以在任何类似现代Unix的操作系统上开箱即用。以下是Linux程序员手册中的LD.SO(8)手册页,其中提到了LD_LIBRARY_PATH
及其目的。这是另外一个摘录:
LD_LIBRARY_PATH
环境变量包含以冒号分隔的目录列表,dynamic linker在查找要加载的共享库时会搜索这些目录。按照提及的顺序搜索目录。
如果未指定,链接器将使用默认值
/lib:/usr/lib:/usr/local/lib
。
正如您所看到的,LD_LIBRARY_PATH
只是一个特定于操作系统的环境变量,用于正确加载共享库。在这方面,Windows具有类似的环境变量:PATH
。在搜索dynamic-link library(DLL,Linux上的SO对应物)时,Windows将扫描其中列出的目录。
关于其他变量(CC
,CFLAGS
,CXX
,CXXFLAGS
,LDFLAGS
),由于历史原因,您经常会看到它们原因。自Unix时代兴起以来,软件项目是使用Make构建的(向下滚动并查看典型makefile
的示例) - 一种开创性的构建工具。这些变量在makefile
s中被如此广泛地使用,最终它们变成了一种约定(例如,参见Implicit Rules)。这就是为什么你甚至可以在Linux上看到它们开箱即用的原因,并且最有可能指向GCC(因为它被认为是Linux的本机工具链)。
总而言之,重点是:不要抓住CC
,CFLAGS
,CXX
,CXXFLAGS
,LDFLAGS
,还有朋友,因为他们只是过去的爆炸。 ;)
使用普通的旧版Make直接构建复杂的软件很快变得乏味且容易出错。因此,开发了许多复杂的构建系统生成器,如GNU Automake或CMake。简而言之,他们的目标是提供(可以说)更易读,易于维护和高级的语法,以便为要构建的任意软件项目定义任意复杂的构建系统。通常,在实际构建项目之前,必须生成本机构建系统(例如,出于可移植性原因,也可以由普通的旧makefile
表示,但不一定)使用相应的工具集来定义这个高级定义。最后,必须使用与生成的(本机)构建系统相对应的工具构建项目(例如,在普通旧makefile
的情况下生成,但不一定)。
由于您提出这些问题,我怀疑您即将使用C或C ++深入了解本机软件开发。如果是这样,我强烈建议你首先选择一个现代的构建系统(CMake将是我的个人推荐),玩它并学习它。
答案 1 :(得分:1)
简单来说,CC
,CFLAGS
,LDFLAGS
等是gnu Makefile变量。如果已定义,即使没有在命令/规则中实际提及