Sun Studio 12:C++ 用户指南

2.4 编译和链接

本节描述了编译和链接程序的某些方面。在以下示例中,使用 CC 编译三个源文件并链接目标文件以生成名为 prgrm 的可执行文件。


example% CC file1.cc file2.cc file3.cc -o prgrm

2.4.1 编译和链接序列

在前面的示例中,编译器会自动生成加载器目标文件(file1.ofile2.ofile3.o),然后调用系统链接程序来为 prgrm 文件创建可执行程序。

编译后,目标文件(file1.ofile2.ofile3.o)仍保留不变。此约定让您易于重新链接和重新编译文件。


注 –

如果只编译了一个源文件,且在同一个操作中链接了程序,则对应的 .o 文件将会被自动删除。要保留所有 .o 文件,就不要在同一个操作中进行编译和链接,除非编译多个源文件。


如果编译失败,您将收到每个错误的对应消息。对于那些出现错误的源文件,不会生成 .o 文件,也不会生成可执行程序。

2.4.2 分别编译和链接

可以在不同的步骤中进行编译和链接。如果使用 -c 选项,将编译源文件并生成 .o 目标文件,但不创建可执行文件。如果不使用 -c 选项,编译器将调用链接程序。通过将编译和链接步骤分开,仅修复一个文件就不需要完整重新编译。以下示例显示了如何以独立的步骤编译一个文件并与其他文件链接:


example% CC -c file1.cc         Make new object file
example% CC -o prgrm file1.o file2.o file3.o       Make executable file

请确保链接步骤列出了生成完整程序所需的全部目标文件。如果在此步骤中缺少任何目标文件,链接将会失败,并出现 "undefined external reference" 错误(缺少例程)。

2.4.3 一致编译和链接

如果在不同的步骤中进行编译和链接,则使用以下编译器选项时,一定要在编译和链接中保持一致:

如果使用其中任何选项编译子程序,请确保在链接时也要使用相同的选项:

在以下示例中,使用 -xcg92 编译器选项编译程序。此选项是包含了 -xtarget=ss1000 的宏,扩展为: -xarch=v8 -xchip=super -xcache=16/64/4:1024/64/1


 example% CC -c -xcg92 sbr.cc
 example% CC -c -xcg92 smain.cc
 example% CC -xcg92 sbr.o smain.o

如果程序使用模板,某些模板可以在链接时实例化。在这种情况下,来自最后一行(链接行)的命令行选项将用于编译实例化的模板。

2.4.4 针对 SPARC V9 编译

只有在运行 64 位内核的 V9 SPARC Solaris 8 操作系统中才支持 64 位对象的编译、链接和执行。针对 64 位的编译通过 –xarch=v9–xarch=v9a-xarch=v9b 选项指明。

2.4.5 诊断编译器

可以使用 –verbose 选项选项在编译程序时显示有用信息,例如调用的程序的名称和版本号以及每个编译阶段的命令行。

命令行上编译器无法识别的任何参数都解释为链接程序选项、目标程序文件名或库名称。

基本区别是:

在以下示例中,请注意,CC 无法识别 -bit,该选项传递给链接程序 (ld),它会尝试解释该选项。因为一个字母的 ld 选项可以连在一起,所以链接程序将 -bit 视为 -b -i -t,所有这些都是合法的 ld 选项。这可能并不是您所希望看到的结果:


example% CC -bit move.cc           < - -bit is not a recognized CC option

CC: Warning: Option -bit passed to ld, if ld is invoked, ignored otherwise

在下一个示例中,用户本想键入 CC 选项 -fast,但遗漏了前导短划线。编译器又一次将参数传递到链接程序,而链接程序将参数解释为文件名称:


example% CC fast move.cc           < -  The user meant to type -fast
move.CC:
ld: fatal: file fast: cannot open file; errno=2
ld: fatal: File processing errors. No output written to a.out

2.4.6 了解编译器的组织

C++ 编译器软件包由前端、优化器、代码生成器、汇编程序、模板预链接程序和链接编辑器组成。CC 命令会自动调用其中每个组件,除非使用命令行选项进行其他指定。

因为这些组件中的任何一个都可能生成错误,并且各个组件执行不同的任务,所以标识生成错误的组件是有意义的。可使用 -v-dryrun 选项帮助解决此问题。

正如下表所示,不同编译器组件的输入文件拥有不同的文件名后缀。后缀建立了要进行的编译类型。有关文件后缀的含义,请参阅表 2–1

表 2–2 C++ 编译系统的组件

组件 

说明 

使用说明 

ccfe

前端(编译器预处理程序和编译器) 

 

iropt

SPARC:代码优化器 

-xO[2-5], -fast

ir2hf

x86:中间语言转换器 

-xO[2-5], -fast

inline

SPARC:汇编语言模板的内联扩展 

指定 .il 文件

ube_ipa

x86:过程间的分析器 

-xcrossfile=1,并使用 -xO4-xO5-fast

fbe

汇编程序 

 

cg

SPARC:代码生成器、内联函数、汇编程序 

 

ube

x86:代码生成器 

-xO[2-5], -fast

CClink

模板预链接程序 

 

ld

非递增式链接编辑器