JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

2.1 入门

2.2 调用编译器

2.2.1 命令语法

2.2.2 文件名称约定

2.2.3 使用多个源文件

2.3 使用不同编译器版本进行编译

2.4 编译和链接

2.4.1 编译和链接序列

2.4.2 分别编译和链接

2.4.3 一致编译和链接

2.4.4 针对 64 位内存模型进行编译

2.4.5 编译器命令行诊断

2.4.6 了解编译器的组织

2.5 预处理指令和名称

2.5.1 Pragma

2.5.2 具有可变数目的参数的宏

2.5.3 预定义的名称

2.5.4 警告和错误

2.6 内存要求

2.6.1 交换空间大小

2.6.2 增加交换空间

2.6.3 虚拟内存的控制

2.6.4 内存要求

2.7 将 strip 命令用于 C++ 目标

2.8 简化命令

2.8.1 在 C Shell 中使用别名

2.8.2 使用 CCFLAGS 指定编译选项

2.8.3 使用 make

2.8.3.1 在 make 中使用 CCFLAGS

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

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 一致编译和链接

如果在不同的步骤中进行编译和链接,在使用3.3.3 编译时选项和链接时选项中所列的编译器选项时,一定要在编译和链接时保持一致。

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

在以下示例中,使用 -library=stlport4 编译器选项编译程序。

example% CC -library=stlport4 sbr.cc -c
example% CC -library=stlport4 main.cc -c
example% CC -library=stlport4 sbr.o main.o -o myprogram 

如果没有一致地使用 -library=stlport4,程序的某些部分将使用缺省的 libCstd,其他部分将使用可选的替换 STLport 库。生成的程序可能不进行链接,因此在任何情况下都不能正常运行。

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

2.4.4 针对 64 位内存模型进行编译

使用 -m64 选项可为目标平台指定 64 位内存模型。64 位对象的编译链接和执行只能在支持 64 位执行的 Oracle Solaris 或 Linux 平台上进行。

2.4.5 编译器命令行诊断

使用 -V 选项可显示 CC 调用的每个程序的名称和版本号。使用 -v 选项可显示 CC 调用的完整命令行。

使用 —verbose=%all 可显示有关编译器的其他信息。

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

基本区别是:

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

example% CC -bit move.cc  -bit is not a recognized compiler 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
代码优化器
-xO[2-5], -fast
ir2hf
x86: 中间语言转换器
-xO[2-5], -fast
inline
SPARC: 汇编语言模板的内联扩展
指定 .il 文件
fbe
汇编程序
cg
SPARC: 代码生成器、内联函数、汇编程序
ube
x86:代码生成器
-xO[2-5], -fast
CClink
模板预链接程序
仅与 -instances=extern 选项一起使用
ld
链接编辑器