首先,您提到的所有变量: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构建的(向下滚动并查看典型makefile
s 的示例)——这是开创性的构建工具之一。makefile
这些变量在s中被如此广泛地使用,以至于最终它们成为一种约定(例如,参见隐式规则)。这就是为什么您甚至可以看到它们在例如 Linux 上开箱即用地定义,并且很可能指向 GCC(因为它被认为是 Linux 的本机工具链)。
总而言之,重点是:不要挠头CC
,CFLAGS
, CXX
, CXXFLAGS
, LDFLAGS
, 和朋友,因为他们只是过去的爆炸。;)
奖金
如今,直接使用普通的 Make 直接构建复杂的软件很快变得乏味且容易出错。因此,已经开发了许多复杂的构建系统生成器,例如GNU Automake或CMake 。简而言之,他们的目标是提供(可以说)更易读、更易于维护和高级语法来为要构建的任意软件项目定义任意复杂的构建系统。通常,在实际构建项目之前,必须生成一个原生构建系统(也可以用普通的旧makefile
s,例如,出于可移植性的原因,但不一定)使用相应的工具集脱离此高级定义。最后,必须使用与生成的(本机)构建系统相对应的工具来构建项目(例如,在普通旧makefile
的情况下使用 Make,但不一定)。
既然您在问这些问题,我怀疑您即将开始使用 C 或 C++ 进行本机软件开发。如果是这样,我强烈建议您首先选择一个现代构建系统(CMake 是我个人的建议),使用它并学好它。