基本的 C 和 C++ 程序开发就是编辑、编译和链接(缺省情况下与编译合并为单个步骤)和运行过程的重复循环。
典型的编译器调用命令按顺序执行下列某些或全部程序。对于链接时优化,将在编译期间多次执行某些阶段。当每个程序运行时,结果按顺序发送至下一个步骤。
- 预处理器
- 编译器,包括以下阶段:
- 前端解析和语义分析
- 循环变换
- 过程间分析
- 优化
- 寄存器分配
- 最终的汇编
- 汇编程序(用于在进行预处理后的 .s 文件和 .S 文件)
- 链接程序 ld
要查看编译器如何单步执行这些阶段,当编译应用程序时指定 -qphsinfo 和 -v 编译器选项。
要创建 C 和 C++ 源程序,您可以使用任何可用的文本编辑器,如 vi 或 emacs。除非配置文件或 -qsourcetype 编译器选项定义了其它非标准文件名后缀,否则源程序必须使用可识别的文件名后缀。请参阅XL C/C++ 输入文件,以获取 XL C/C++ 可识别的文件名后缀列表。
要使 C 或 C++ 源程序成为有效的程序,它必须符合在 XL C/C++ Advanced Edition V8.0 for Linux Language Reference 中指定的语言定义。
要编译源程序,请通过下面显示的语法使用一个编译器调用命令:
>>-compiler_invocation------------------------------------------> .-----------------------------------------. | .---------------------. | V V | | >------+-----------------+-+----input_file---+----------------->< '-cmd_line_option-'
编译器调用命令执行所有必要的步骤来编译 C 或 C++ 源文件、汇编任何 .s 和 .S 文件并将目标文件和库链接至可执行程序。
为了新的 C 或 C++ 应用程序能够工作,您应考虑使用 xlC 或 xlc++ 或者其线程安全等效项进行编译。
xlC 和 xlc++ 将编译诸如 C 或 C++ 的程序源代码,但因为当 C 编译器调用链接程序时未指定 C++ 代码所需要的库,所以使用 xlc 编译 C++ 文件可能导致链接或运行时错误。其它基本编译器调用命令的目的主要是为 C 或 C++ 语言的不同级别和扩展提供显式编译支持。
除了基本编译器调用命令以外,XL C/C++ 还提供了许多基本编译器调用的专用变体。基本编译器调用的变体是通过将后缀连接至该调用命令的名称来命名的。调用变体的后缀意义为:
XL C/C++ 提供线程安全编译调用,您可以在编译要在多处理器环境下使用的并行化应用程序时使用这些调用。
- xlC_r
- xlc++_r
- xlc_r
- c99_r
- c89_r
- cc_r
这些调用类似于其相应的基本编译器调用,只是它们会将已编译的对象链接和绑定至线程安全组件和库。
编译器的输入文件为:
编译器按您在命令行上指定的顺序编译源文件。如果编译器找不到指定的源文件,则编译器生成一条错误消息并继续编译下一个文件(如果下一个文件存在的话)。
如果您有不符合标准 C 或 C++ 文件命名约定的 C 或 C++ 源文件,则您可以使用 -+ 编译器选项来指示编译器像处理 C 或 C++ 源文件一样处理这样的文件。当 -+ 编译器选项生效时,除了有 .a、.o、.so、.s 或 .S 文件名后缀的文件以外,这样的文件将作为 C++ 源文件进行编译。
包含文件也包含源代码,且常常具有与平常用于 C 或 C++ 源文件的那些后缀不同的后缀。
缺省配置文件是 /etc/opt/ibmcmp/vac/8.0/vac.cfg 和 /etc/opt/ibmcmp/vac/8.0/gxlc.cfg。
-qpdf1 选项生成运行时概要信息以在后续编译中使用。此信息存储在名称与模式 *pdf* 匹配的一个或多个隐藏文件中。
C 和 C++ 生成的输出文件为:
每个 .u 文件包含一行表示输入文件,并包含一个条目表示每个包含文件,该文件采用以下通用格式:
file_name.o :file_name.c file_name.o :include_file_name
将根据编译器搜索 #include 预处理器伪指令的顺序规则来列示包含文件。如果找不到包含文件,则不会将它添加至 .u 文件。不具有 include 语句的文件所生成的输出文件将包含一个仅列示输入文件名的行。
编译器选项执行各种功能,如设置编译器特征、描述要生成的目标代码、控制发出的诊断消息和执行某些预处理器功能。
您可以用以下方式指定编译器选项:
- 在命令行上使用命令行编译器选项。
- 在编译器配置文件内找到的节中
- 在源代码中使用伪指令语句
- 或通过使用这些技术的任何组合。
当指定了多个编译器选项时,有可能发生选项冲突和不兼容。为了以一致的方式解决这些冲突,编译器通常应用以下一般优先级顺序:
- 源文件中的伪指令语句覆盖命令行设置
- 命令行编译器选项设置覆盖配置文件设置
- 配置文件设置覆盖缺省设置
通常,如果调用编译器时在命令行上多次指定了相同的编译器选项,则最后指定的那个选项起作用。
具有累积行为的其它选项是 -R 和 (小写 L)。
还可以将编译器选项传递至链接程序、汇编程序和预处理器。有关编译器选项和如何指定它们的更多信息,请参阅 Compiler options reference。
缺省情况下,不需要执行任何特殊操作来链接 XL C/C++ 程序。编译器调用命令自动调用 链接程序来生成可执行输出文件。例如,运行以下命令:
xlC file1.C file2.o file3.C
编译并生成目标文件 file1.o 和 file3.o,然后将所有目标文件(包括 file2.o)提交至链接程序以生成一个可执行文件。
在链接之后,遵循运行 XL C/C++ 程序中的指示信息来执行程序。
要生成稍后可以链接的目标文件,使用 -c 选项。
xlc++ -c file1.C # Produce one object file (file1.o) xlc++ -c file2.C file3.C # Or multiple object files (file1.o, file3.o) xlc++ file1.o file2.o file3.o # Link object files with appropriate libraries
通常最好的方法是通过编译器调用命令执行链接程序,因为这会自动将某些额外的 ld 选项和库名传递至链接程序。
XL C/C++ 允许程序利用操作系统设施进行动态和静态链接:
如果多个程序使用共享库中的例程,则动态链接的程序占用较少的磁盘空间和虚拟内存。在链接期间,它们不需要任何特殊的预防措施来避免与库例程的命名冲突。如果几个程序同时使用相同的共享例程,则它们的性能可能超过静态链接的程序。它们还允许您升级共享库中的例程而不需要重新链接。
因为此格式的链接是缺省值,所以您不需要其它选项来打开它。
可以将静态链接的程序移至系统并在系统上运行它们而不需要 XL C/C++ 库。如果它们执行许多对库例程的调用或调用许多小例程,则它们的性能可能超过动态链接的程序。如果您要避免与库例程产生命名冲突,则在为程序中的数据对象和例程选择名称时它们确实需要一些预防措施。如果您在操作系统的一个级别上编译它们而在操作系统的不同级别上运行它们,则它们也可能不工作。
有关链接您的程序的更多信息,请参阅 Invoking the linkage editor。
此外,有关编译和链接库的更多信息,请参阅 Constructing a library。