GCC和链接环境变量和标志

时间:2013-04-16 18:05:27

标签: gcc build linker environment-variables

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代码:CCCFLAGS
  • 用于编译C ++代码:CXXCPPFLAGS

连接标志:

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

CCCFLAGSCXXCPPFLAGS的含义是什么?为什么它们不包含在gcc官方环境变量列表中?

2 个答案:

答案 0 :(得分:21)

首先,您提到的所有变量:CCCFLAGSCXXCXXFLAGSLDFLAGSLD_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将扫描其中列出的目录。

关于其他变量(CCCFLAGSCXXCXXFLAGSLDFLAGS),由于历史原因,您经常会看到它们原因。自Unix时代兴起以来,软件项目是使用Make构建的(向下滚动并查看典型makefile的示例) - 一种开创性的构建工具。这些变量在makefiles中被如此广泛地使用,最终它们变成了一种约定(例如,参见Implicit Rules)。这就是为什么你甚至可以在Linux上看到它们开箱即用的原因,并且最有可能指向GCC(因为它被认为是Linux的本机工具链)。

总而言之,重点是:不要抓住CCCFLAGSCXXCXXFLAGSLDFLAGS,还有朋友,因为他们只是过去的爆炸;)

奖金


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

由于您提出这些问题,我怀疑您即将使用C或C ++深入了解本机软件开发。如果是这样,我强烈建议你首先选择一个现代的构建系统(CMake将是我的个人推荐),玩它并学习它。

答案 1 :(得分:1)

简单来说,CCCFLAGSLDFLAGS等是gnu Makefile变量。如果已定义,即使没有在命令/规则中实际提及

,这些也将由隐式规则使用