第 3 章 使用 C++ 编译器选项
本章解释了如何使用命令行 C++ 编译器选项,并按功能汇总它们的使用。A.2 选项参考中对这些选项进行了详细说明。
3.1 语法概述
下表显示了本书中使用的典型选项语法格式的示例。
表 3–1 选项语法格式示例语法格式示例
-选项–E
–选项值–Ipathname
–选项=值–xunroll=4
–选项 值–o filename
圆括号、大括号、方括号、"|" 或 "-" 字符以及省略号是选项说明中使用的元字符,而不是选项自身的一部分。有关用法语法的详细说明,请参见本手册前言中的印刷约定。
3.2 通用指南
C++ 编译器选项的某些通用指南:
-llib 选项用于与库 liblib.a(或 liblib.so)链接。较稳妥的方式是总是将 -llib 放在源文件和对象文件后面,这样可以确保库搜索顺序。
通常,编译器选项的处理顺序是从左到右(但 -U 选项在所有 -D 选项之后处理这种情况除外),从而可以有选择地覆盖宏选项(包括其他选项的选项)。此规则不适用于链接程序选项。
-features、-I-l、-L、-library、-pti、-R、-staticlib、-U、-verbose 和 -xprefetch 选项都会累积,但它们不会覆盖。
-D 选项会累积,但相同名称的多个 -D 选项会互相覆盖。
源文件、目标文件和库是按其在命令行上的出现顺序编译和链接。
3.3 按功能汇总的选项
在本节中,编译器选项按功能分组以便提供快速参考。有关各个选项的详细说明,请参阅附录 A。
这些选项适用于除了特别注明之外的所有平台;基于 SPARC 的系统上的 Solaris OS 特有的功能标识为 SPARC,基于 x86 的系统上的 Solaris OS 特有的功能标识为 x86。
3.3.1 代码生成选项
表 3–2 代码生成选项选项操作
–compat设置编译器的主发行版本兼容模式。
+e{0|1}控制虚拟表的生成。
–g用于与调试一起使用的编译。
–KPIC生成位置独立的代码。
–Kpic生成位置独立的代码。
–mt编译和链接多线程代码。
-xaddr32将代码限定于 32 位地址空间 (x86/x64)
-xarch指定目标体系结构。
–xcode=a(SPARC) 指定代码地址空间。
–xMerge(SPARC) 将数据段和文本段合并。
-xtarget指定目标系统。
–xmodel针对 Solaris x86 平台修改 64 位对象形式
+w标识可能产生不可预料结果的代码。
+w2发出由 +w 发出的所有警告以及关于技术违规的警告,这些技术违规可能是无害的,但可能会降低程序的最大可移植性。
-xregs如果编译器可以使用更多的寄存器用于临时存储(临时寄存器),那么编译器将能生成速度更快的代码。该选项使得附加临时寄存器可用,而这些附加寄存器通常是不适用的。
-z arg链接程序选项。
3.3.2 编译时性能选项
表 3–3 编译时性能选项选项操作
–instlib禁止生成已出现在指定库中的模板实例。
-m32|-m64指定编译的二进制对象的内存模型。
-xinstrument编译程序并为其提供程序设备以便 Thread Analyzer 对其进行分析。
–xjobs设置编译器可以为完成工作而创建的进程数量。
–xpch可以减少应用程序的编译时间,该应用程序的源文件共享一组共同的 include 文件。
–xpchstop指定在使用 -xpch 选项创建预编译头文件时要考虑的最后一个 include 文件。
–xprofile_ircache(SPARC) 重新使用在执行 -xprofile=collect 期间保存的编译数据。
–xprofile_pathmap(SPARC) 支持单个配置文件目录中有多个程序或共享库。
3.3.3 编译时选项和链接时选项
下表列出了在链接时和编译时均必须指定的选项。
表 3–4 编译时选项和链接时选项选项操作
-fast选择用于控制可执行代码速度的编译选项的最优组合。
-m32|-m64指定编译的二进制对象的内存模型。
-mt扩展为 -D_REENTRANT -lthread 的宏选项。
-xarch指定指令集体系结构。
-xautopar为多个处理器启用自动并行化。
-xhwcprof(SPARC) 为基于硬件技术器的文件配置启用编译器支持。
-xipo通过调用过程间分析组件来执行整个程序优化。
-xlinkopt对可重定位对象文件执行链接时优化。
-xmemalign(SPARC) 指定假定的最大内存对齐以及未对齐的数据访问的行为。
-xopenmp支持用于显式并行化的 OpenMP 接口,包括一组源代码指令、运行时库例程和环境变量。
-xpagesize设置栈和堆的首选页面大小。
-xpagesize_heap设置堆的首选页面大小。
-xpagesize_stack设置栈的首选页面大小。
-xpg准备目标代码来收集数据以使用 gprof(1) 进行文件配置。
-xprofile收集用于配置文件的数据或使用配置文件进行优化。
-xvector=lib启用对向量库函数调用的自动生成。
3.3.4 调试选项
表 3–5 调试选项选项操作
+d不扩展 C++ 内联函数。
–dryrun显示但不编译由驱动程序传递到编译器的选项。
–E仅对 C++ 源文件运行预处理程序,并将结果发送到 stdout。不编译。
–g用于与调试一起使用的编译。
–g0编译以便进行调试,但不禁用内联。
–H输出包含文件的路径名称。
–keeptmp保留编译时创建的临时文件。
–migration解释可以从早期编译器获得有关移植信息的位置。
–P仅预处理源文件,输出到 .i 文件。
–Qoption直接将选项传递到编译阶段。
–readme显示联机 README 文件的内容。
–s从可执行文件中去掉符号表,这样可以保护调试代码的能力。
–temp=dir为临时文件定义目录。
–verbose=vlst控制编译器详细内容。
-xcheck对栈溢出增加一个运行时检查。
-xdumpmacros输出诸如定义、定义及未定义的位置和已使用的位置的宏信息。
–xe仅检查语法和语义错误。
–xhelp=flags显示编译器选项汇总列表。
–xport64对 32 位体系结构到 64 位体系结构的移植过程中的常见问题发出警告。
3.3.5 浮点选项
表 3–6 浮点选项选项操作
-fma(SPARC) 启用自动生成浮点乘加指令。
–fns[={no|yes}](SPARC) 禁用或启用 SPARC 非标准浮点模式。
–fprecision=px86:设置浮点精度模式。
–fround=r设置启动时生效的 IEEE 舍入模式。
–fsimple=n设置浮点优化首选项。
–fstorex86:强制浮点表达式的精度。
–ftrap=tlst设置启动时生效的 IEEE 陷阱操作模式。
–nofstorex86:禁用表达式的强制精度。
–xlibmieee使 libm 在异常情况下对于数学例程返回 IEEE 754 值。
3.3.6 语言选项
表 3–7 语言选项选项操作
–compat设置编译器的主发行版本兼容模式。
–features=alst启用或禁用各种 C++ 语言特性。
-xchar在 char 类型定义为无符号的系统上,简化代码的移植。
–xldscope控制变量和函数定义的缺省链接程序范围,以创建更快更安全的共享库。
–xthreadvar(SPARC) 更改缺省的线程局部存储访问模式。
-xtrigraphs启用三字母序列的识别。
–xustr启用识别由 16 位字符构成的文本字符串。
3.3.7 库选项
表 3–8 库选项选项操作
–Bbinding请求符号、动态或静态库链接。
–d{y|n}允许或不允许整个可执行文件的动态库。
–G生成动态共享库来取代可执行文件。
–hname为生成的动态共享库指定内部名称。
–i通知 ld(1) 忽略任何 LD_LIBRARY_PATH 设置。
–Ldir将 dir 添加到要在其中搜索库的目录列表。
–llib将 liblib.a 或 liblib.so 添加到链接程序的库搜索列表。
–library=llst强制将特定库和相关文件包含到编译和链接中。
–mt编译和链接多线程代码。
–norunpath不将库的路径生成到可执行文件中。
–Rplst将动态库搜索路径生成到可执行文件中。
–staticlib=llst说明哪些 C++ 库是静态链接的。
–xar创建归档库。
-xbuiltin[=opt]启用或禁用标准库调用的更多优化。
-xia(Solaris) 链接合适的区间运算库并设置适当的浮点环境。
-xlang=l[,l]包含适当的运行库,并确保指定语言的正确运行时环境。
–xlibmieee使 libm 在异常情况下对于数学例程返回 IEEE 754 值。
–xlibmil内联选定的 libm 库例程以进行优化。
–xlibmopt使用优化数学例程的库。
–xnolib禁止链接缺省系统库。
–xnolibmil在命令行上取消 – xlibmil。
–xnolibmopt不使用数学例程库。
3.3.8 废弃的选项
注 –
以下选项要么当前已废弃所以编译器不再接受它们,要么将从以后的发行版中删除。
表 3–9 废弃的选项选项操作
-library=%all废弃的选项,在以后的发行版本中将被删除。
-xlic_lib=sunperf使用 —library=sunperf 可链接到 Sun 性能库。
-xlicinfo已过时。
–noqueue禁用许可证队列。
-ptr编译器忽略。以后的编译器发行版本可以使用其他行为来重用该选项。
-sb、—sbfast、—xsb、—xsbfast已过时,默认忽略。
-vdelx废弃的选项,在以后的发行版本中将被删除。
-x386使用适当的 —xtarget 选项。
-x486使用适当的 —xtarget 选项。
-xcg89使用 -xtarget=ss2。
-xcrossfile改用 -xipo。
-xnativeconnect已废弃,没有替代选项。
-xprefetch=yes改用 -xprefetch=auto,explicit。
-xprefetch=no改用 -xprefetch=no%auto,no%explicit。
-xvector=yes改用 -xvector=lib。
-xvector=no改用 -xvector=none。
3.3.9 输出选项
表 3–10 输出选项选项操作
–c仅编译;生成目标 (.o) 文件,但抑制链接。
–dryrun显示但不编译由驱动程序传递到编译器的所有命令行。
–E仅对 C++ 源文件运行预处理程序,并将结果发送到 stdout。不编译。
-erroff禁止编译器警告消息。
-errtags显示每条警告消息的消息标记。
-errwarn如果发出指示的警告消息,cc 将以失败状态退出。
-filt禁止编译器应用到链接程序错误消息的过滤。
–G生成动态共享库来取代可执行文件。
–H输出包含文件的路径名称。
–migration解释可以从早期编译器获得有关移植信息的位置。
–o filename将输出文件或可执行文件的名称设置为 filename。
–P仅预处理源文件,输出到 .i 文件。
–Qproduce sourcetype使 CC 驱动程序生成类型为 sourcetype 的输出。
–s从可执行文件去掉符号表。
–verbose=vlst控制编译器详细内容。
+w必要时输出附加警告。
+w2适当时输出更多警告。
–w禁止警告消息。
-xdumpmacros输出诸如定义、定义及未定义的位置和已使用的位置的宏信息。
-xe对源文件仅执行语法和语义检查,但不生成任何对象或可执行代码。
–xhelp=flags显示编译器选项汇总列表。
–xhelp=readme显示联机 README 文件的内容。
–xM输出 makefile 依赖性信息。
–xM1生成依赖性信息,但排除
/usr/include。
–xtime报告每个编译阶段的执行时间。
–xwe将所有的警告转换为错误。
-z arg链接程序选项。
3.3.10 运行时性能选项
表 3–11 运行时性能选项选项操作
–fast选择编译选项的组合以优化某些程序的执行速度。
-fma(SPARC) 启用自动生成浮点乘加指令。
-g指示编译器和链接程序准备程序以进行性能分析(以及调试)。
–s从可执行文件去掉符号表。
-m32|-m64指定编译的二进制对象的内存模型。
-xalias_level启用编译器执行基于类型的别名分析和优化。
–xarch=isa指定目标体系结构指令集。
-xbinopt准备二进制文件以便以后进行优化、转换和分析。
-xbuiltin[=opt]启用或禁用标准库调用的更多优化。
–xcache=c(SPARC) 定义优化器的目标高速缓存属性。
–xcg89为通用 SPARC v7 体系结构编译。
–xcg92为 SPARC V8 体系结构编译。
–xchip=c指定目标处理器芯片。
–xF启用函数和变量的链接程序重新排序。
-xinline=flst指定用户编写的哪些例程可以被优化器内联
-xipo执行过程间的优化。
–xlibmil内联选定的 libm 库例程以进行优化。
–xlibmopt使用优化数学例程的库。
–xlinkopt(SPARC) 在对目标文件进行优化的基础上对生成的可执行文件或动态库执行链接时优化。
–xmemalign=ab(SPARC) 指定假定的最大内存对齐以及未对齐的数据访问的行为。
–xnolibmil在命令行上取消 – xlibmil。
–xnolibmopt不使用数学例程库。
–xOlevel将优化级别指定为 level。
–xpagesize设置栈和堆的首选页面大小。
-xpagesize_heap设置堆的首选页面大小。
-xpagesize_stack设置栈的首选页面大小。
-xprefetch[=lst]在支持预取的体系结构上启用预取指令。
-xprefetch_level控制 -xprefetch=auto 设置的自动插入预取指令的主动性。
–xprofile收集运行时文件配置数据或使用运行时文件配置数据进行优化。
–xregs=rlst控制临时寄存器的使用。
–xsafe=mem(SPARC) 不允许有基于内存的陷阱。
–xspace(SPARC) 不允许会增大代码大小的优化。
–xtarget=t指定目标指令集和优化系统。
–xthreadvar更改缺省的线程局部存储访问模式。
–xunroll=n启用在可能的场合下解开循环。
–xvis(SPARC) 使编译器可以识别 VIS 指令集中定义的汇编语言模板。
3.3.11 预处理程序选项
表 3–12 预处理程序选项选项操作
–Dname[=def]为预处理程序定义符号 name。
–E仅对 C++ 源文件运行预处理程序,并将结果发送到 stdout。不编译。
-H输出包含文件的路径名称。
–P仅预处理源文件,输出到 .i 文件。
–Uname删除预处理程序符号 name 的初始定义。
–xM输出 makefile 依赖性信息。
–xM1生成依赖性信息,但排除 /usr/include。
3.3.12 文件配置选项
表 3–13 文件配置选项选项操作
–p准备目标代码来收集数据以使用 prof 进行文件配置。
–xpg编译以便使用 gprof 配置程序进行文件配置。
–xprofile收集运行时文件配置数据或使用运行时文件配置数据进行优化。
3.3.13 参考选项
表 3–14 参考选项选项操作
–migration解释可以从早期编译器获得有关移植信息的位置。
–xhelp=flags显示编译器选项汇总列表。
–xhelp=readme显示联机 README 文件的内容。
3.3.14 源文件选项
表 3–15 源文件选项选项操作
-H输出包含文件的路径名称。
–Ipathname将 pathname 添加到 include 文件搜索路径。
-I-更改包含文件搜索规则
–xM输出 makefile 依赖性信息。
–xM1生成依赖性信息,但排除 /usr/include。
3.3.15 模板选项
表 3–16 模板选项选项操作
–instances=a控制模板实例的放置和链接。
–template=wlst启用或禁用各种模板选项。
3.3.16 线程选项
表 3–17 线程选项选项操作
–mt编译和链接多线程代码。
–xsafe=mem(SPARC) 不允许有基于内存的陷阱。
–xthreadvar(SPARC) 更改缺省的线程局部存储访问模式。