GCC 和链接环境变量和标志

标签 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代码:CC, CFLAGS
  • 用于编译 C++ 代码:CXX, CPPFLAGS

以及链接标志:

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

CCCFLAGSCXXCPPFLAGS是什么意思?为什么它们没有包含在 gcc官方环境变量列表中?

最佳答案

首先,您提到的所有变量:CCCFLAGSCXXCXXFLAGSLDFLAGSLD_LIBRARY_PATH,源自Unix OS家族。这些变量首先与 GCC 无关,这就是为什么您在手册中看不到它们的踪迹。

其中唯一有意义的变量(也与 GCC 没有直接联系)是 LD_LIBRARY_PATH。您可能会发现这个变量在任何现代类 Unix 操作系统上都是开箱即用的。这里是 LD.SO(8) Linux Programmer's Manual 的手册页,其中提到了 LD_LIBRARY_PATH 及其用途。这里还有一段摘录:

The LD_LIBRARY_PATH environment variable contains a colon-separated list of directories that are searched by the dynamic linker 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。 Windows 将在搜索 dynamic-link library 时扫描其中列出的目录(DLL,Linux 上 SO 的对应物)。

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

总而言之,重点是:不要对 CCCFLAGSCXX 感到头疼CXXFLAGSLDFLAGS 和 friend ,因为他们只是过去的爆炸;)

奖金


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

既然您提出了这些问题,我怀疑您即将开始使用 C 或 C++ 进行 native 软件开发。如果是这样,我强烈建议您首先选择一个现代构建系统(CMake 是我个人的建议),使用它并好好学习它。

关于GCC 和链接环境变量和标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16044020/

相关文章:

ios - 没有冲突类别方法的警告

c - 需要写一个cast操作符

C 程序可以编译,但执行后立即终止

build - 是否有 TFS 2015 的构建过程模板?

C++:单例类模板导致链接错误?

c++ - g++ 在 C++ 中的链接错误

c++ - 链接本身依赖于静态库的自己的静态库时的 undefined reference

c - 汇编循环遍历字符串来计算字符数

ios - 白色标签 iOS 应用程序

java - Maven 无法解析类 teSTLink.api.java.client.TestLinkAPIException