GCC和链接环境变量和标志

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环境变量的官方列表中?
>在哪里可以找到LDFLAGS,LD_LIBRARY_PATH或其他链接相关环境变量的官方文档?
>不太重要的是,在哪里可以在实践中如何使用所有这些变量的指导/教程?

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

其中唯一有意义的变量(与GCC也没有直接的连接)是LD_LIBRARY_PATH.您可能会发现这个变量在任何现代的类Unix操作系统上被定义为开箱即用.以下是“Linux程序员手册”的LD.SO(8)手册,其中提到了LD_LIBRARY_PATH及其目的.这里还有一个提取:

The LD_LIBRARY_PATH environment variable contains a colon-separated list of directories that are searched by the 07001 when looking for a shared library to load.

The directories are searched in the order they are mentioned in.

If not specified, the linker uses the default, which is /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的示例)构建了软件项目,这是开创性的构建工具之一.这些变量在makefiles中被广泛使用,最终他们成为一种惯例(例如,参见Implicit Rules).这就是为什么你甚至可以在Linux上看到他们定义的开箱即用,最有可能指向GCC(因为它被认为是Linux的本机工具链).

总而言之,重点是:不要把头靠在CC,CFLAGS,CXX,CXXFLAGS,LDFLAGS和朋友身上,因为它们只是过去的爆炸. 😉

奖金

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

由于您提出这些问题,我怀疑您即将使用C或C进行本地软件开发.如果是这样,我强烈建议您先选择一个现代化的构建系统(CMake将是我的个人推荐),并与之一起学习.

翻译自:https://stackoverflow.com/questions/16044020/gcc-and-linking-environment-variables-and-flags

转载注明原文:GCC和链接环境变量和标志