GCC和链接环境变量和标志

GCC和链接环境变量和标志,gcc,build,linker,environment-variables,Gcc,Build,Linker,Environment Variables,GCC官方文件中的以下链接: 解释以下环境变量: 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 但我以前也听说/读过这些其他编译标志: 用于编

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

解释以下环境变量:

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,<代码> CPPPLAGS < /代码>
和链接标志:

  • 对于链接阶段:
    LDFLAGS
  • 编译代码后:
    LD\u LIBRARY\u PATH

CC
CFLAGS
CXX
cppfagas
的含义是什么?为什么它们没有包含在
gcc
官方环境变量列表中?

首先,您提到的所有变量:
CC
CFLAGS
CXX
cxflags
LDFLAGS
LD\u LIBRARY\u PATH
,都源于Unix操作系统系列。这些变量首先与GCC无关,这就是为什么在手册中看不到它们的踪迹

其中唯一有意义的变量(与GCC也没有直接联系)是
LD\u LIBRARY\u PATH
。您可能会发现这个变量是在任何现代类Unix操作系统上现成定义的。下面是Linux程序员手册中的手册页,其中提到了
LD\u LIBRARY\u PATH
及其用途。这里还有一个摘录:

环境变量
LD_LIBRARY_PATH
包含一个以冒号分隔的目录列表,当查找要加载的共享库时,将由搜索

目录将按照中提到的顺序进行搜索

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

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

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

总之,要点是:不要在
CC
CFLAGS
CXX
cxflags
LDFLAGS
和朋友身上搔首弄姿,因为他们只是过去的爆炸物<代码>;)

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


既然你问了这些问题,我怀疑你会用C或C++跳入本机软件开发。如果是这样的话,我强烈建议您首先选择一个现代构建系统(CMake将是我个人的推荐),使用它,并好好学习。

简单来说,
CC
CFLAGS
LDFLAGS
等都是gnu Makefile变量。如果定义了,这些将由隐式规则使用,即使在命令/规则中没有实际提及它们

它们与GCC无关。它们只是Unix上的一种约定,因此在Unix系列中受到开箱即用的支持。我猜它们成为了一种约定,因为按照约定,普通的旧makefile往往依赖于这些变量。许多构建系统(如Autotools)也采用了这种约定,并使用类似的变量来表示相同的内容。老实说,这些旗帜完全是一堆废话(也许除了
LD\u LIBRARY\u PATH
),每次遇到它们都会让我想起60年代。如果您使用的是现代构建(您应该是)系统,那么您可以忘记它们。用于指出共享库所在的目录,以便依赖于这些共享库的应用程序可以针对它们进行正确链接(动态)。正如您所看到的,这同样与软件开发无关,也与GCC无关,而只是Unix系列如何处理动态链接、软件组件的安装路径及其执行的一个特性/概念。如果您对这些评论感到满意,我可以将其表述为一个答案。请随意询问更多。是的@Haroogan。欢迎您将此表述为一个答案,因为它已经提供了相当多的信息。不确定我是否会接受任何东西,因为我想给帖子一些时间来收集答案。这是一个很棒的答案。谢谢@Haroogan。你的答案中也有很多关于现代构建系统的好东西。我不敢相信它被删除了(尽管我对政策很熟悉)。再次感谢。这个我