GCC和链接环境变量和标志
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 但我以前也听说/读过这些其他编译标志: 用于编
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。你的答案中也有很多关于现代构建系统的好东西。我不敢相信它被删除了(尽管我对政策很熟悉)。再次感谢。这个我