vis studiolinux怎么更改文件名名

B.2 cc 选项 (Oracle Solaris Studio 12.2:C 用户指南)
&& B.2 cc 选项Oracle Solaris Studio 12.2:C 用户指南B.2 cc 选项
本节按字母顺序介绍 cc 选项。手册页 cc (1) 中也提供了这些说明。使用 cc -flags 选项可获得一行有关这些说明的摘要。
注明特定于一个或多个平台的选项可被接受,且不会出现错误,但在其他所有平台上会被忽略。
打开详细模式,显示命令选项的展开方式。显示调用的每个组件。
B.2.2 -###
在调用每个组件时显示该组件,但不实际执行它。还显示命令选项扩展的过程。
B.2.3 -Aname[( tokens)]
将 name 作为谓词与指定的 tokens 关联,如同使用 #assert 预处理指令一样。预断言:
system(unix)
machine(sparc) (SPARC)
machine(i386) (x86)
cpu(sparc) (SPARC)
cpu(i386) (x86)
这些预断言在 -Xc 模式下无效。
如果 -A 后面仅跟随一个短横线 (-),将导致所有预定义宏(除那些以 __ 开头的宏以外)和预定义断言被忽略。
B.2.4 -B[static| dynamic]
指定用于链接的库绑定是 static 类型还是 dynamic 类型,可分别指明库是非共享的还是共享的。
如果给定 -lx 选项,则 -Bdynamic 使链接编辑器查找名称为 libx.so 的文件,然后查找名称为 libx.a 的文件。
&Bstatic 使链接编辑器仅查找名称为 libx.a 的文件。此选项可作为一个切换开关在命令行中多次指定。此选项及其参数将传递给 ld(1)。
注 & 在 Solaris 64 位编译环境中,许多系统库(例如 libc)都只能作为动态库使用。因此,请勿在命令行上将 -Bstatic 用作最后一个切换开关。
此选项及其参数传递给链接程序。
防止 C 预处理程序删除注释,位于预处理指令行中的注释除外。
指示 C 编译器用 ld(1) 抑制链接并为每个源文件生成一个 .o 文件。您可使用 -o 选项显式指定单个目标文件。当编译器生成每个 i 或 . c 输入文件的对象代码时,总是会在当前的工作目录中创建一个对象 (.o) 文件。如果抑制链接步骤,将会同时抑制删除目标文件。
B.2.7 -Dname[( arg[,arg])][= expansion]
使用可选参数定义宏,如同使用 #define 预处理指令定义宏一样。如果未指定 =expansion,则编译器假定为 1。
有关编译器预定义宏的列表,请参见 cc(1) 手册页。
B.2.8 -d[y|n]
-dy 指定动态链接,这是链接编辑器中的缺省链接。
-dn 指定链接编辑器中的静态链接。
此选项及其参数将传递给 ld(1)。
注 & 如果将此选项与动态库结合使用,将导致致命错误。大多数系统库仅作为动态库可用。
B.2.9 -dalign
(SPARC) 已废弃。您不该使用此选项。改用 -xmemalign=8s。有关更多信息,请参见。有关已废弃的选项的完整列表,请参见。在 x86 平台上会在无提示的情况下忽略此选项。
仅通过预处理程序运行源文件,并将输出发送给 stdout。预处理程序直接构建到编译器中,但 -Xs 模式除外,因为该模式会调用 /usr/ccs/lib/cpp。包含预处理程序行号信息。另请参见 & P 选项。
B.2.11 -errfmt[=[ no%]error]
如果要将字符串 "error:" 作为前缀添加到错误消息开头以将错误消息与警告消息相区分,可使用此选项。此前缀也可附加到通过 -errwarn 转换成错误的警告。
-errfmt 标志
向所有错误消息添加前缀 "error: "。&
不向任何错误消息添加前缀 "error: "。&
如果不指定此选项,则编译器将其设置为 -errfmt=no%error。如果您指定 -errfmt,但不提供值,则编译器将其设置为 -errfmt=error。
B.2.12 -errhdr [=h]
将来自头文件的警告限制为由以下标志所指示的头文件组:
-errhdr 选项
检查使用的所有头文件。&
不检查头文件。&
检查所有用户头文件,但 /usr/include 及其子目录中的头文件除外。此外,还检查编译器提供的所有头文件。这是缺省值。
B.2.13 -erroff[= t]
此命令抑制 C 编译器警告消息,但对错误消息没有影响。此选项适用于所有警告消息,无论这些警告消息是否已被 -errwarn 指定为导致非零退出状态。
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序是很重要的;例如 %all,no%tag 抑制除 tag 以外的所有警告消息。下表列出了 -erroff 值:
-erroff 标志
抑制由该 tag 指定的警告消息。可通过 -errtags=yes 选项来显示消息的标记。
启用此 tag 指定的警告消息
抑制所有警告消息&
启用所有警告消息(缺省值)&
缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。
-erroff 选项只能抑制来自 C 编译器前端并在使用 -errtags 选项时显示标记的警告消息。您可以更好地控制错误消息抑制。请参见。
B.2.14 -errshort[= i]
使用此选项可在编译器发现类型不匹配时控制所生成错误消息的详细程度。当编译器发现涉及到大聚集的类型不匹配时,此选项特别有用。
i 可以是以下各项之一:
-errshort 标志
以短形式输出错误消息,且不会出现类型扩展。不扩展聚集成员、函数参数和返回类型。&
以完全详细形式输出错误消息,并显示不匹配类型的完全扩展。&
对于具有标记名称的类型,输出错误消息的标记名称。无标记名称的类型将以扩展形式显示。&
如果不指定 -errshort,编译器会将该选项设置为 -errshort=full。如果指定 -errshort 但不提供值,编译器会将该选项设置为
-errshort=tags。
此选项不会累积,它接受在命令行指定的最后一个值。
B.2.15 -errtags[= a]
为 C 编译器前端的每条警告消息显示消息标志,可以使用 -erroff 选项抑制该消息,或使用 -errwarn 选项将其设置为致命错误。来自 C 编译器驱动程序以及 C 编译系统其他组件的消息不带错误标记,使用 -errof 选项并不能抑制这些消息,而使用 -errwarn 选项也不会产生致命错误。
a 可以是 yes 或 no。缺省值为 -errtags=no。指定 -errtags 与指定 -errtags=yes 等效。
B.2.16 -errwarn[= t]
使用 -errwarn 选项可以在出现指定的警告消息时使 C 编译器退出,并指示故障状态。
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序很重要,例如如果出现除 tag 之外的任何警告,%all,no%tag 会使 cc 以致命状态退出。
由于编译器错误检查的改善和功能的增加,C 编译器生成的警告消息也会因发行版本而异。使用 -errwarn=%all 进行编译而不会产生错误的代码,在编译器下一个发行版本中编译时也可能出现错误。
只有来自 C 编译器前端在使用 -errtags 选项时会显示标记的警告消息可以使用 -errwarn 选项进行指定,从而使 C 编译器以失败状态退出。
下表详细列出了 -errwarn 值:
-errwarn 标志
在此 tag 指定的消息作为警告消息发出时导致 cc 以致命状态退出。如果未出现 tag,则没有影响。
在 tag 指定的消息仅作为警告消息发出时防止 cc 以致命状态退出。如果未发出 tag 指定的消息,则不会产生任何影响。为了避免在发出警告消息时导致 cc 以致命状态退出,可使用该选项来还原以前用该选项和 tag 或 %all 指定的警告消息。
在发出任何警告消息时导致编译器以致命状态退出。%all 可以后跟 no%tag,以避免该行为的特定警告消息。
在发出任何警告消息时防止警告消息导致编译器以致命状态退出。&
缺省值为 -errwarn=%none。如果单独指定 -errwarn,它与 -errwarn=%all 等效。
B.2.17 -fast
此选项是一个宏,可将其有效用作为尽量提高运行时性能而调整可执行程序的起点。-fast 是一个宏,随编译器发行版本的升级而变化,并扩展为目标平台特定的多个选项。可使用 -# 选项或 -xdryrun 检查 -fast 的扩展选项,并将 -fast 的相应选项结合到正在进行的可执行文件优化过程中。
-fast 的扩展选项包括 -xlibmopt 选项,该选项使编译器可使用优化的数学例程库。有关更多信息,请参见。
-fast 选项会影响 errno 的值。有关更多信息,请参见。
用 -fast 编译的模块必须也用 -fast 进行链接。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见。
&fast 选项不适于计划在编译机器之外的其他目标机器上运行的程序。在这种情况下,请在 -fast 后附带相应的 -xtarget 选项。例如:
cc -fast -xtarget=generic ...
对于依赖于 SUID 指定的异常处理的 C 模块,请在 -fast 后附带 -xnolibmil:
% cc -fast -xnolibmil
使用 -xlibmil 时,通过设置 errno 或调用 matherr(3m) 无法标记异常。
&fast 选项不适于要求与 IEEE 754 标准严格一致的程序。
下表列出了 -fast 在各平台中选择的选项集。
-fast 扩展选项标志
-fsimple=2
-xalias_level=basic
-xbuiltin=%all
-xmemalign=8s
-xprefetch=auto,explicit
-xregs=frameptr
-xtarget=native
注 & 有些优化对程序行为进行特定假定。如果程序不符合这些假定,应用程序将会崩溃或产生错误结果。请参阅各个选项的描述,以确定您的程序是否适合用 -fast 编译。
由这些选项执行的优化可能会改变由 ISO C 和 IEEE 标准定义的程序的行为。有关详细信息,请参见特定选项的描述。
&fast 的作用与命令行上的宏扩展相同。因此,您可以通过在 -fast 后附带预期的优化级别或代码生成选项来覆盖优化级别和代码生成选项。使用 -fast -xO4 对进行编译类似于使用 -xO2 -xO4 对进行编译。后者优先。
在 x86 上,-fast 选项包括 -xregs=frameptr。有关详细信息,特别是编译混合 C、Fortran 和 C++ 源代码时,请参见该选项的介绍。
请勿对依赖于 IEEE 标准异常处理的程序使用此选项;否则会产生不同的数值结果、程序提前终止或意外的 SIGFPE 信号。
要在运行的平台上查看 -fast 的实际扩展,请使用
% cc -fast -xdryrun
B.2.18 -fd
报告 K&R 样式的函数定义和声明。
B.2.19 -features=[v]
下表列出了可代替 v 使用的值。
-features 标志
[no%]conststrings
启用或禁用将文本字符串放置在只读内存中。缺省值为 -features=conststrings,这会将文本字符串放在只读的数据段中。请注意,现在,使用此选项进行编译时,编译尝试写入文本字符串内存位置的程序会导致段故障。
extensions
允许零大小的结构/联合声明以及返回语句返回一个值的 void 函数起作用。&
将外部内联函数生成为全局函数。这是缺省值,符合 1999 C 标准。使用 -features=no%extinl 编译新代码可获得与旧版的 C 和 C++ 编译器相同的 extern 内联函数处理方式。
将外部内联函数生成为静态函数。&
此选项被禁用。&
旧的 C 和 C++ 对象(使用本发行版之前的 Solaris Studio 编译器创建的对象)可以与新的 C 和 C++ 对象链接,而不会更改旧对象的行为。要获得标准的符合规范的行为,您必须使用当前编译器重新编译旧代码。
如果不为 -features 指定设置,编译器将把它设置为 -features=extinl。
B.2.20 -flags
输出每个可用编译器选项的简短摘要。
B.2.21 -flteval[={ any|2}]
(x86) 使用此选项可以控制浮点表达式的求值方式。
-flteval 标志
浮点表达式求值为 long double。&
根据构成表达式的变量和常量类型的组合来对浮点表达式进行求值。&
如果未指定 -flteval,编译器会将其设置为 -flteval=any。如果指定了 -flteval 但未提供值,编译器会将其设置为 -flteval=2。
您不能将以下选项与 -flteval=2 一起指定:
-fprecision
-xarch=amd64
-xarch=sse2
另请参见。
B.2.22 -fma[={none| fused}]
(SPARC) 启用自动生成浮点乘加指令。-fma=none 禁用这些指令的生成。-fma=fused 允许编译器通过使用浮点乘加指令,尝试寻找改进代码性能的机会。
缺省值是 -fma=none。
要使编译器生成乘加指令,最低要求是 -xarch=sparcfmaf 且优先级别至少为 -xO2。如果生成了乘加指令,编译器会标记此二进制程序,以防止该程序在不受支持的平台上执行。
乘加指令可以免除乘法和加法之间的中间舍入步骤。因此,如果使用 -fma=fused 编译,程序可能会生成不同的结果,但精度通常会增加而不是降低。
B.2.23 -fnonstd
(SPARC) 此选项是用于 -fns 和 -ftrap=common 的宏。
B.2.24 -fns[={no|yes}]
(SPARC) 打开 SPARC 非标准浮点模式。
缺省值为 -fns=no ,即 SPARC 标准浮点模式。-fns 与 -fns=yes 相同。
可以选择使用 =yes 或 =no,此方法使您可以切换包含 -fns 的其他某个宏标志(如 -fast)后面的 -fns 标志。
在一些 SPARC 系统上,使用非标准浮点模式会禁用&渐进下溢&,导致将微小的结果刷新为零,而不是产生非正规数。它还导致次正规操作数被替换为零而无提示。在那些不支持硬件中的渐进下溢和次正规数的 SPARC 系统上,使用此选项将显著提高某些程序的性能。
在启用了非标准模式的情况下,浮点运算可能会产生不符合 IEEE 754 标准要求的结果。有关详细信息,请参见《数值计算指南》。
此选项仅对 SPARC 系统且仅在编译主程序时使用才有效。在 x86 系统上,忽略此选项。
(x86) 选择 SSE 刷新为零模式以及(如果可用)非正规数为零模式。
此选项导致将次正规结果刷新为零。如果可用的话,此选项还导致将次正规操作数视为零。
此选项不会影响不利用 SSE 或 SSE2 指令集的传统 x86 浮点运算。
与 -KPIC 等效
B.2.26 -fpic
与 -Kpic 等效
B.2.27 -fprecision=p
(x86) -fprecision={single, double, extended}
将浮点控制字中的舍入精度模式位分别初始化为 single(24 位)、double(53 位)或 extended(64 位)。缺省的浮点舍入精度模式为 extended。
注意,在 x86 中,浮点舍入精度模式的设置只影响精度,不影响指数、范围。
该选项仅在 x86 系统上且仅在编译主程序时才有效,但如果编译 64 位 (-m64) 或 SSE2 启动的 (-xarch=sse2) 处理器,忽略此选项。在 SPARC 系统上也忽略此选项。
B.2.28 -fround=r
设置程序初始化期间在运行时建立的 IEEE 754 舍入模式。
r 必须是以下值之一: nearest、 tozero、negative、positive。
缺省值为 -fround=nearest。
含义与 ieee_flags 子例程的含义相同。
如果 r 为 tozero、negative 或 positive,此标志将在程序开始执行时分别将舍入方向模式设置为舍入到零、舍入到负无穷大或舍入到正无穷大。当 r 为 nearest 或未使用 -fround 标志时,舍入方向模式将保留其初始值不变(缺省为舍入到最接近的值)。
只有编译主程序时该选项才有效。
B.2.29 -fsimple[= n]
允许优化器进行有关浮点运算的简化假定。
编译器缺省采用 -fsimple=0。指定 -fsimple 与指定 -fsimple=1 等效。
如果存在 n,它必须是 0、1 或 2。
-fsimple 标志
-fsimple=0
允许无简化假定。保持严格的 IEEE 754 一致性。&
-fsimple=1
允许保守简化。产生的代码与 IEEE 754 不完全一致,但多数程序所产生的数值结果没有更改。&
在 -fsimple=1 的情况下,优化器可假定:
在进程初始化之后,IEEE 754 缺省舍入/捕获模式不发生改变。
可以删除不生成可见结果(潜在的浮点异常除外)的计算。
使用无穷大或 NaN 作为操作数的计算无需将 NaN 传送给其结果;例如,x*0 可能替换为 0。
计算不依赖于零的符号。
如果使用 -fsimple=1,则不允许优化器进行完全优化,而不考虑舍入或异常。特别是,在运行时舍入模式包含常量的情况下,浮点计算不能由产生不同结果的计算替换。
-fsimple=2
包含 -fsimple=1 的所有功能,当 -xvector=simd 生效时,还允许使用 SIMD 指令计算约简。
编译器尝试主动浮点优化,这可能导致很多程序因舍入更改而产生不同数值结果。例如,-fsimple=2 允许优化器将给定循环中 x/y 的所有计算都替换为 x*z,其中保证在循环中至少对 x/y 进行一次求值,z=1/y,并且已知 y 和 z 的值在循环执行期间具有常量值。
即使 -fsimple=2,也不允许优化器在不产生任何内容的程序中引入浮点异常。
有关优化对精度的影响的详细说明,请参见由 Rajat Garg 和 Ilya Sharapov 合著的《Techniques for Optimizing Applications: High Performance
Computing》。
B.2.30 -fsingle
(仅限 -Xt 和 -Xs 模式)使编译器按单精度而非双精度对 float 表达式求值。由于已按单精度对
float 表达式进行求值,因此如果在 -Xa 或 -Xc 模式下使用编译器,此选项将无效。
B.2.31 -fstore
(x86) 将表达式或函数赋值给一个变量时或将表达式强制转换为短浮点类型时,该命令可使编译器将浮点表达式或函数的值转换为赋值语句左侧的类型,而不是在寄存器中保留值。由于舍入和截尾,结果可能会与使用寄存器值生成的结果不同。这是缺省模式。
要关闭此选项,请使用 -nofstore 选项。
B.2.32 -ftrap=t[ ,t...]
设置启动时生效的 IEEE 捕获模式,但不安装 SIGFPE 处理程序。可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。
t 可以是下列值之一。
-ftrap 标志
[no%]division
[不] 在除以零时自陷。&
[no%]inexact
[不] 在结果不精确时自陷。&
[no%]invalid
[不] 在无效操作上自陷。&
[no%]overflow
[不] 在溢出上自陷。&
[no%]underflow
[不] 在下溢上自陷。&
在所有以上内容中自陷。&
不在以上任何内容中自陷。&
在无效、除以零和溢出时自陷。&
注意,选项的 [no%] 形式只用于修改 %all 和 common 值的含义,且必须与其中的一个值一起使用,如以下示例所示。选项自身的
[no%] 形式不会显式导致禁用特定的陷阱。
如果不指定 -ftrap,则编译器假定 -ftrap=%none。
示例: &ftrap=%all,no%inexact 意味着设置所有陷阱,但 inexact 除外。
如果使用 -ftrap=t 编译一个例程,就还要使用相同的 -ftrap=t 选项来编译该程序的所有例程;否则就会获得意外的结果。
使用 -ftrap=inexact 陷阱时务必谨慎。只要浮点值不能精确表示,使用
& ftrap=inexact 便会产生自陷。例如,以下语句就会产生这种情况:
x = 1.0 / 3.0;
只有编译主程序时该选项才有效。请小心使用该选项。如果希望启用 IEEE 陷阱,请使用 &ftrap=common。
生成共享对象而非动态链接的可执行文件。此选项将传递给 ld(1),并且无法与 -dn 选项一起使用。
使用 -G 选项时,编译器不将任何缺省 -l 选项传递到 ld 选项。如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的 -l 选项。
如果通过指定 -G 以及其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在与生成的共享对象链接时也指定这些选项。
创建共享对象时,用 -xarch=v9 编译的所有目标文件还必须用显式
-xcode 值(如中所记录)进行编译。
为使用 dbx(1) 和性能分析器 analyzer(1) 进行调试生成附加符号表信息。
如果指定 -g,并且优化级别为 -xO3 或更低,则编译器提供几乎进行全面优化的最佳效果符号信息。尾部调用优化和后端内联被禁用。
如果指定 -g,并且优化级别为 -xO4,则编译器提供进行全面优化的最佳效果符号信息。
使用 -g 选项进行编译,以使用性能分析器的全部功能。虽然某些性能分析功能不需要使用 -g,但必须使用 -g 进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息。有关更多信息,请参见 analyzer(1) 手册页和《性能分析器》手册。
使用 -g 生成的注释消息描述编译器在编译程序时进行的优化和变换。使用 er_src(1) 命令来显示与源代码交叉的消息。
注 & 在以前的发行版中,此选项强制编译器在缺省情况下使用增量链接程序 (ild),而不使用用于编译器的仅链接调用的链接程序 (ld)。也就是说,使用 -g 时,只要使用编译器来链接目标文件,编译器的缺省行为就是自动调用 ild 而不是 ld,除非您在命令行上指定了 -G 或源文件。现在已不再是这种情况。增量链接程序不再可用。
有关调试的更多信息,请参见《使用 dbx 调试程序》手册。
输出到标准错误,每行一个错误,包含当前编译期间每个文件的路径名。这样输出的目的是显示包含在其他文件中的文件。
此处,程序 sample.c 包含文件 stdio.h 和 math.h;math.h 包含文件 floatingpoint.h,该文件本身还包含使用 sys/ieeefp.h 的函数:
% cc -H sample.c
/usr/include/stdio.h
/usr/include/math.h
/usr/include/floatingpoint.h
/usr/include/sys/ieeefp.h
B.2.36 -h name
为动态共享库分配一个名称,从而可以获得一个库的不同版本。通常,-h 后面的 name 应与 -o 选项后指定的文件名相同。-h 和 name 之间的空格是可选的。
链接程序会为该库分配指定的 name,并在库文件中将该名称记录为库的内在名称。如果 -hname 选项不存在,则库文件中不记录任何内在名称。
当运行时链接程序将库装入可执行文件时,它将内在名称从库文件复制到可执行文件和一组所需共享库文件中。每个可执行文件都有这样的列表。如果没有共享文件的内部名称,链接程序就复制共享库文件的路径。
B.2.37 -I[-| dir]
-I dir 将 dir 添加到在其中搜索 #include 文件(/usr/include 前是相对文件名)的目录列表中,也就是说,这些目录路径不以 /(斜线)开头。
以指定的顺序搜索多个 -I 选项的目录。
有关编译器搜索模式的更多信息,请参见。
将选项传递给链接程序,以忽略任何 LD_LIBRARY_PATH 或 LD_LIBRARY_PATH_64 设置。
B.2.39 -include filename
此选项使编译器将 filename 视为作为 #include 预处理程序指令出现在主源文件的第一行。考虑源文件 t.c:
如果使用命令 cc -include t.h t.c 编译 t.c,则编译时好像源文件包含以下项:
#include "t.h"
编译器在其中搜索 filename 的第一个目录是当前工作目录而不是包含主源文件的目录,这就是显式包括某个文件时的情况。例如,下面的目录结构包含两个名称相同但位置不同的头文件:
如果您的工作目录是 foo/bar,并且您使用命令 cc ../t.c -include t.h 进行编译,则编译器会包括 foo/bar 中的 t.h 而不是 foo/ 中的此文件,后者是源文件 t.c 内包含 #include 指令时的情况。
如果编译器在当前工作目录中找不到使用 -include 指定的文件,则会在正常目录路径中搜索该文件。如果您指定多个 -include 选项,则文件的包括顺序与它们在命令行中的顺序相同。
B.2.40 -KPIC
(SPARC) 已废弃。您不该使用此选项。改用 -xcode=pic32。
有关更多信息,请参见。有关废弃选项的完整列表,请参见。
(x86) -KPIC 与 -Kpic 相同。
B.2.41 -Kpic
(SPARC) 已废弃。您不该使用此选项。改用 -xcode=pic13。有关更多信息,请参见。有关废弃选项的完整列表,请参见。
(x86) 生成要在共享库中使用的与位置无关的代码。允许最多引用 2**11 个唯一外部符号。
B.2.42 -keeptmp
保留编译期间创建的临时文件,而不自动将其删除。
B.2.43 -Ldir
将 dir 添加到通过 ld(1) 在其中搜索库的目录列表中。此选项及其参数将传递给 ld(1)。
注 & 任何时候都不要将编译器安装区域 /usr/include、/lib 或 /usr/lib 指定为搜索目录。
B.2.44 -lname
与目标库 libname.so 或 libname.a 链接。库在命令行中的顺序很重要,因为符号是从左向右进行解析。
此选项必须位于 sourcefile 参数之后。
B.2.45 -m32|-m64
指定编译的二进制对象的内存模型。
使用 -m32 来创建 32 位可执行文件和共享库。使用 -m64 来创建 64 位可执行文件和共享库。
在所有 Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、pointer 数据类型)是缺省值。在启用了 64 位的 Linux 平台上缺省为 LP64 内存模型(64 位 long 和指针数据类型)。-m64 仅允许在支持 LP64 模型的平台上使用。
使用 -m32 编译的对象文件或库无法与使用 -m64 编译的对象文件或库链接。
使用 -m32|-m64 编译的模块必须还使用 -m32 |-m64 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见。
在 x86/x64 平台上使用 -m64 编译具有大量静态数据的应用程序时,可能还需要 -xmodel=medium。请注意,部分 Linux 平台不支持中等模型。
请注意,在早期的编译器发行版中,由 -xarch 选项中选择的指令集来指定内存模型(ILP32 或 LP64)。从 Solaris Studio 12 编译器开始,就不再是这样了。在大多数平台上,仅需将 -m64 添加到命令行便可以创建 64 位对象。
在 Solaris 上,-m32 是缺省选项。在支持 64 位程序的 Linux 系统上,-m64 -xarch=sse2 是缺省选项。
另请参见 -xarch。
B.2.46 -mc
从目标文件的 .comment 部分中删除重复字符串。使用 -mc 标志时,会调用 mcs -c。
B.2.47 -misalign
(SPARC) 已废弃。您不该使用此选项。应改用 -xmemalign=1i 选项。有关更多信息,请参见。有关废弃选项的完整列表,请参见。
B.2.48 -misalign2
(SPARC) 已废弃。您不该使用此选项。应改用 -xmemalign=2i 选项。有关更多信息,请参见。有关废弃选项的完整列表,请参见。
B.2.49 -mr[, string]
-mr 可从 .comment 部分中删除所有字符串。使用此标志时,会调用 mcs -d -a。
-mr,string 可从 .comment 部分中删除所有字符串,并在目标文件的该部分插入 string。如果 string 包含嵌入空白,则必须将其括入引号。空 string 将导致 .comment 部分为空。此选项将作为 -d -astring 传递给 mcs。
B.2.50 -mt[={yes |no}]
使用此选项,可以通过 Solaris 线程或 POSIX 线程 API 编译和链接多线程代码。-mt=yes 选项确保库以正确的顺序链接。
此选项将 -D_REENTRANT 传递给预处理程序。
要使用 Solaris 线程,应将 thread.h 头文件包含进来并使用 -mt=yes 选项进行编译。要在 Solaris 平台上使用 POSIX 线程,请包括 pthread.h 头文件并使用 -mt=yes 选项进行编译。
在 Linux 平台上,只有 POSIX 线程 API 可用。(Linux 平台上没有 libthread)。因此,Linux 平台上的 -mt=yes 添加 -lpthread 而不是 -lthread。要在 Linux 平台上使用 POSIX 线程,请使用 -mt 进行编译。
请注意,当使用 -G 进行编译时,-lthread 和 -lpthread 均不会自动包括在 -mt=yes 内。生成共享库时,您需要显式列出这些库。
-xopenmp 选项(用于使用 OpenMP 共享内存并行化 API)自动包含 -mt=yes。
如果使用 -mt=yes 进行编译并在单独的步骤中进行链接,则除了在编译步骤中外,还必须在链接步骤中使用 mt=yes 选项。如果使用 -mt=yes 编译和链接一个转换单元,则必须使用 -mt=yes 编译和链接该程序的所有单元。
-mt=yes 是编译器的缺省行为。如果不需要该行为,使用 -mt=no 编译。
选项 -mt 等效于 -mt=yes。
B.2.50.1 另请参见
-xnolib、Solaris《多线程编程指南》和《链接程序和库指南》
B.2.51 -native
此选项与 -xtarget=native 意义相同。
B.2.52 -nofstore
(x86) 将表达式或函数赋值给一个变量时或将表达式强制转换为短浮点类型时,该命令不将浮点表达式或函数的值转换为赋值语句左侧的类型,而在寄存器中保留该值。另请参见。
使用缺省优化级别 -xO3。-O 宏现在扩展为 -xO3 而非 -xO2。
这种特殊变化会提高运行时性能。但是,对于依赖于被自动视为 volatile 的所有变量的程序,-x03 可能不适用。可能做出此假定的典型程序包括设备驱动程序,以及实现其自己的同步基元的较旧的多线程应用程序。解决方法是用 -xO2 而不是 -O 进行编译。
B.2.54 -o filename
将输出文件命名为 filename(与缺省文件名 a.out 相对)。filename 的名称不能与sourcefile 相同,因为 cc 不覆盖源文件。 此选项及其参数将传递给 ld(1)。
运行 通过 C 预处理程序运行源文件。然后将输出放在带有 .i 后缀的文件中。与 -E 不同,此选项不在输出中包括预处理程序类型的行号信息。另请参见 -E 选项。
已废弃,请参见。
B.2.57 -Q[y|n]
向或不向输出文件发出标识信息。-Qy 是缺省值。
如果使用 -Qy,则将关于每个调用的编译工具的标识信息添加到输出文件的 .comment 部分,使用 mcs 可访问这部分文件。此选项对软件管理十分有用。
-Qn 可抑制此信息。
B.2.58 -qp
与 -p 相同。
B.2.59 -Rdir[ :dir]
将用来指定库搜索目录的、冒号分隔的目录列表传递给运行时链接程序。如果此选项存在且非空,则它记录在输出目标文件中并传递给运行时链接程序。
如果同时指定了 LD_RUN_PATH 和 -R 选项,则 -R 选项优先。
指示 cc 生成汇编源文件,而不汇编程序。
从输出目标文件中删除所有符号调试信息。此选项不能与 -g 一同指定。
传递给 ld(1)。
B.2.62 -traceback[={ %none|common|signals_list}]
如果执行中出现严重错误,将发出栈追踪。
当程序生成某些信号时,-traceback 选项会导致可执行文件向 stderr 发出栈跟踪、转储内核并退出。如果多个线程都生成一个信号,则只为第一个生成栈跟踪。
要使用回溯,请在链接时将 -traceback 选项添加到编译器命令行中。编译时也接受该选项,除非生成可执行二进制文件,否则将忽略此选项。使用 -traceback
和 -G 创建共享库是个错误。
-traceback 选项
指定在出现下列任一常见信号时发出栈跟踪:sigill、sigfpe、sigbus、sigsegv 或 sigabrt。
signals_list
指定应生成栈跟踪的信号名称的逗号分隔列表,采用小写形式。可以捕捉以下信号(导致生成核心文件的信号):sigquit、sigill、sigtrap、sigabrt、sigemt、sigfpe、sigbus、 sigsegv、sigsys、sigxcpu、sigxfsz。
在上述任一信号前加上 no% 可以禁用信号缓存。
例如:-traceback=sigsegv,sigfpe 将在 sigsegv 或 sigfpe 出现时生成栈跟踪和核心转储。
%none 或 none
如果不指定该选项,则缺省值为 -traceback=%none
只使用 -traceback 而不使用 = 信号表示 -traceback=common
注意:如果不需要核心转储,用户可以使用以下方法将 coredumpsize 限制设置为零:
% limit coredumpsize 0
-traceback 选项对运行时性能没有影响。
B.2.63 -Uname
取消定义预处理程序符号 name。此选项可删除由 -D 在命令行上创建的预处理程序符号 name 的任何初始定义,包括那些由命令行驱动程序放置的定义。
-U 对源文件中的预处理程序指令没有任何影响。可以在命令行上指定多个 -U 选项。
如果在命令行中为 -D 和 -U 指定了相同的 name,则取消定义 name,而无论这些选项出现的顺序如何。在以下示例中,-U 取消定义 __sun:
cc -U__sun text.c
由于已取消定义 __sun,因此在 test.c 中采用以下形式的预处理程序语句将不会生效。
#ifdef(__sun)
有关预定义符号的列表,请参见。
指示 cc 在编译器执行时输出每个组件的名称和版本 ID。
指示编译器执行更严格的语义检查并启用其他与 lint 类似的检查。例如,如下所示代码:
#include &stdio.h&
main(void)
printf("Hello World.\n");
编译和执行时不会出现问题。如果使用 -v,该代码仍可编译;但是,编译器会显示以下警告:
"hello.c", line 5: warning: function has no return statement:
-v 不能给出 lint(1) 给出的所有警告。尝试通过 lint 运行以上示例。
B.2.66 -Wc ,arg
将参数 arg 传递给指定的组件 c。有关组件的列表,请参见。
每个参数与前一个参数之间仅以逗号分隔。所有 -W 参数均在常规命令行参数之后进行传递。在紧靠逗号之前使用转义符 \(反斜杠)可将逗号作为参数的一部分。所有 -W 参数均在常规命令行参数之后进行传递。
例如,-Wa,-o,objfile 按顺序将 -o 和 objfile 传递给汇编程序。此外,-Wl,-I,name 将导致链接阶段覆盖动态链接程序的缺省名称 /usr/lib/ld.so.1。
参数传递到工具的顺序可能会因其他指定的命令行选项而更改。
c 可以是以下项之一:
汇编程序: (fbe); (gas)
C 代码生成器: (cg) (SPARC) ;
cc 驱动程序&
中间代码翻译者 (ir2hf)(x86)
链接编辑器 (ld)
O(大写的 o)
过程间优化器&
o(小写的 o)&
预处理程序 (cpp)
C 代码生成器 (ube) (x86)
编译器 (acomp) (ssbd, SPARC)
优化器: (iropt)
抑制编译器警告消息。
此选项会覆盖 error_messages pragma。
B.2.68 -X[c|a| t|s]
-X(注意大写X)选项指定符合 ISO C 标准的各种级别。-xc99 的值影响 -X 选项所应用的 ISO C 标准的版本。-xc99 选项的缺省值为支持 1999 ISO/IEC C 标准的 -xc99=all。-xc99=none 支持 1990 ISO/IEC C 标准。有关对 1999 ISO/IEC 支持功能的讨论,请参见。有关 ISO/IEC C 与 K&R C 的不同点的讨论,请参见。
缺省模式是 -Xa。
(c =一致性)对使用非 ISO C 构造的程序发出错误和警告。此选项与 ISO C 严格一致,没有 K&R C 兼容性扩展。如果使用 -Xc 选项,预定义的宏 __STDC__ 的值为 1。
这是缺省编译器模式。ISO C 以及 K&R C 兼容性扩展,具有 ISO C 要求的语义更改。如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果 -Xa 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。如果使用 -Xa 选项,预定义的宏 __STDC__ 的值为 -0。
(t = transition) 该选项使用 ISO C 以及 K&R C 兼容性扩展,不具有 ISO C 要求的语义更改。 如果 K&R C 和 ISO C 为同一构造指定不同语义,则编译器使用 ISO C 解释。如果将 -Xt 选项与 -xtransition 选项配合使用,则编译器发出关于不同语义的警告。使用 -Xt 选项时,预定义的宏 __STDC__ 的值为 0。
(s = K&R C) 试图对 ISO C 和 K&R C 产生不同行为的所有语言构造发出警告。编译器语言包括与 K&R C 兼容的所有功能。此选项调用 cpp 以进行预处理。__STDC__ 在此模式下未定义。
B.2.69 -x386
(x86) 已废弃。您不该使用此选项。改用 -xchip=generic。有关废弃选项的完整列表,请参见。
B.2.70 -x486
(x86) 已废弃。您不该使用此选项。改用 -xchip=generic。有关废弃选项的完整列表,请参见。
-xaddr32[=yes|no]
(仅限 Solaris x86/x64)-xaddr32=yes 编译标志将生成的可执行文件或共享对象限定为 32 位地址空间。
以这种方式编译的可执行文件会导致创建限定为 32 位地址空间的进程。
当指定了 -xaddr32=no 时,会产生通常的 64 位二进制文件。
如果未指定 -xaddr32 选项,则假定 -xaddr32=no。
如果仅指定了 -xaddr32,则使用 -xaddr32=yes。
此选项仅适用于 -m64 编译,并且仅仅在支持 SF1_SUNW_ADDR32 软件功能的 Solaris 平台上适用。由于 Linux 内核不支持地址空间限制,因此该选项在 Linux 上不可用。
链接时,如果单个目标文件是使用 -xaddr32=yes 编译的,则假定整个输出文件是使用 -xaddr32=yes 编译的。
限定为 32 位地址空间的共享对象必须由在受限的 32 位模式地址空间内执行的进程装入。
有关详细信息,请参阅《链接程序和库指南》中的 SF1_SUNW_ADDR32 软件功能定义。
B.2.72 -xalias_level[= l]
编译器使用 -xalias_level 选项确定为了使用基于类型的别名分析执行优化可以进行何种假设。此选项使指定的别名级别对正在编译的转换单元生效。
如果不指定 -xalias_level 命令,编译器将假定 -xalias_level=any。如果指定不带值的 -xalias_level,则缺省值为 -xalias_level=layout。
-xalias_level 选项要求的优化级别为 -xO3 或更高。如果优化级别设置较低,则发出警告并忽略 -xalias_level 选项。
切记,如果使用 -xalias_level 选项,但无法坚持为任何别名级别描述的关于别名的所有假定和约束,则程序的行为未定义。
将 l 替换为下表中的某一术语。
别名歧义消除级别
编译器假定所有内存引用都可在此级别上互为别名。在级别 -xalias_level=any 上,不存在基于类型的别名分析。
如果使用 -xalias_level=basic 选项,编译器将假定调用不同 C 基本类型的内存引用不互为别名。此外,编译器还假定对其他所有类型的引用互为别名,并可以使用任何 C 基本类型作为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。
例如,在 -xalias_level=basic 级别上,编译器假定类型为 int
* 的指针变量不会访问浮点对象。因此,编译器可安全执行优化,该优化假定类型为 float * 的指针不会使用 int * 类型指针引用的相同内存作为别名。
如果使用 -xalias_level=weak 选项,编译器会假定任何结构指针都可指向任何结构类型。
任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中的表达式之前进行声明。&
您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。&
在级别 -xalias_level=weak 上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用使用涉及任何其他类型的内存引用作为别名。
如果使用 -xalias_level=layout 选项,编译器将假定所涉及类型与内存中类型具有相同顺序的内存引用可以互为别名。
编译器假定其类型在内存中看起来并不相同的两个引用并不互为别名。如果初始结构成员在内存中看起来相同,则编译器假定任何两个内存均通过不同的结构类型进行访问。然而,在此级别上,不应使用指向结构的指针来访问不同结构对象的某字段,该字段不属于这两个结构之间在内存中看起来相同的公共初始成员序列。这是因为编译器假定此类引用并不互为别名。&
在 -xalias_level=layout 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用涉及其他类型的内存引用作为别名。
如果使用 -xalias_level=strict 选项,编译器将假定涉及结构或联合等类型并且在删除标记后相同的内存引用可以互为别名。反之,编译器假定涉及那些即使在删除标记后也不相同的类型的内存引用不互为别名。
然而,任何结构或联合类型,只要它包含对编译的源代码的表达式中引用的任何类型的引用,或者包含对从编译的源代码外部引用的任何类型的引用,就必须在编译的源代码中该表达式之前进行声明。&
您可以通过包含某个程序的所有头文件来满足此约束,这些头文件包含的类型引用了在所编译的源代码的表达式中引用的对象的类型。在
-xalias_level=strict 级别上,编译器假定涉及不同 C 基本类型的内存引用并不互为别名。编译器假定使用 char * 的引用可以使用任何其他类型的引用作为别名。
如果使用 -xalias_level=std 选项,编译器将假定类型和标记必须相同才能作为别名,但是,使用 char * 的引用可以使用涉及其他任何类型的引用作为别名。此规则与 1999 ISO C 标准中对指针解除引用的限制相同。正确使用此规则的程序将非常易于移植,而且优化之后性能大大提高。
如果使用 -xalias_level=strong 选项,则与 std 级别应用相同限制,但此外,编译器还假定类型 char * 的指针只用来访问类型为 char 的对象。此外,编译器还假定不存在内部指针。内部指针被定义为指向结构成员的指针。
B.2.73 - xannotate[=yes|no]
(Solaris) 指示编译器创建以后可由诸如 binopt(1) 之类的二进制修改工具转换的二进制文件。使用 -xannotate=no 选项可以阻止这些工具修改该二进制文件。-xannotate=yes 选项必须与 --xO1 或更高的优化级别一起使用时才有效。
此选项在 Linux 平台上不可用。
B.2.74 &xarch=isa
指定目标指令集体系结构 (instruction set architecture, ISA)。
该选项将编译器生成的代码限制为特定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。不过,使用该选项会影响二进制程序的可移植性。
注 & 分别使用 -m64 或 -m32 选项来指定打算使用的内存模型 LP64(64 位)或 ILP32(32 位)。-xarch 选项不再指示内存模型,除非是为了与早期的发行版兼容,如下所示。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
B.2.74.1 用于 SPARC 的 -xarch 标志
下表提供了 SPARC 平台上每个 -xarch 关键字的详细信息。
用于 SPARC 平台的 -xarch 标志
使用大多数处理器通用的指令集。这是缺省值。&
为了在大多数 64 位 平台上获得良好性能而进行编译。(仅限 Solaris)。&
该选项等效于 -m64 -xarch=generic,用于与早期的发行版兼容。可使用 -m64 指定 64 位编译,来取代 - xarch=generic64。
为了在此系统上获得良好性能而进行编译。编译器为运行它的当前系统处理器选择适当的设置。&
编译以在此系统中取得良好的性能(仅限 Solaris)。该选项等效于 -m64 -xarch=native,用于与早期的发行版兼容。
针对 SPARC-V9 ISA (但不带有可视化指令集 (Visual Instruction Set, VIS),也不带有其他特定于实现的 ISA 扩展)进行编译。该选项在 V9 ISA 上使编译器生成高性能代码。&
针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。&
此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视化指令集 (VIS) 2.0 版上生成目标代码。&
针对 SPARC-V 9 ISA 的 SPARC VIS 版本 3 进行编译。允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0、UltraSPARC-III 扩展(包括可视指令集版本 2.0 以及混合乘加指令和可视指令集版本 3.0 中的指令。&
允许编译器使用 SPARC-V9 指令集,加 UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。&
必须将 -xarch=sparcfmaf 与
fma=fused 结合使用,并具有某个优化级别,以使编译器尝试查找机会来自动使用乘加指令。
针对 SPARC-V9 ISA 的 sparcima 版本进行编译。使编译器可以使用如下指令集内的指令:SPARC-V9 指令集、UltraSPARC 扩展(包括可视化指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视化指令集 (Visual Instruction Set, VIS) 版本 2.0)、SPARC64 VI 扩展(用于浮点乘加)和 SPARC64 VII 扩展(用于整数乘加)。&
等效于 -m64 -xarch=sparc。使用 -xarch=v9 来获取 64 位内存模型的传统 makefile 和脚本仅需使用 -m64。
等效于 -m64 -xarch=sparcvis,用于与早期发行版兼容。
等效于 -m64 -xarch=sparcvis2,用于与早期发行版兼容。
另请注意:
用 generic,sparc, sparcvis2, sparcvis3, sparcfmaf, sparcima 编译的对象二进制文件 (.o) 可以链接起来并一起执行,但只能在支持链接的所有指令集的处理器上运行。
对于任何特定选择,生成的可执行文件在传统体系结构中可能不运行或运行缓慢。而且,由于所有指令集中均未实现四精度 (long double) 浮点指令,因此编译器不在其生成的代码中使用这些指令。
B.2.74.2 用于 x86 的 -xarch 标志
下表列出了 x86 平台上的 -xarch 标志。
x86 上的 -xarch 标志
等效于 -m64 -xarch=sse2(仅限 Solaris)。使用 -xarch=amd64 来获取 64 位内存模型的传统 makefile 和脚本仅需要使用 -m64。
等效于 -m64 -xarch=sse2a(仅限 Solaris)。
使用大多数处理器通用的指令集。这是缺省值,等效于使用 &m32 编译时的 pentium_pro,以及使用 &m64 编译时的 sse2。
为了在大多数 64 位 平台上获得良好性能而进行编译。(仅限 Solaris)。该选项等效于 -m64 -xarch=generic,用于与早期的发行版兼容。可使用 -m64 指定 64 位编译,来取代 - xarch=generic64。
为了在此系统上获得良好性能而进行编译。编译器为运行它的当前系统处理器选择适当的设置。&
编译以在此系统中取得良好的性能(仅限 Solaris)。该选项等效于 -m64 -xarch=native,用于与早期的发行版兼容。
pentium_pro
使指令集限于 32 位 pentium_pro 体系结构。&
pentium_proa
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 pentium_pro 体系结构中。&
将 SSE 指令集添加到 pentium_pro 体系结构。
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE 体系结构中。&
将 SSE2 指令集添加到 pentium_pro 体系结构。
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE2 体系结构中。&
将 SSE3 指令集添加到 SSE2 指令集中。&
使用 SSSE3 指令集补充 pentium_pro、SSE、SSE2 和 SSE3 指令集。&
使用 SSE4.1 指令集补充 pentium_pro、SSE、SSE2、SSE3 和 SSSE3 指令集。&
使用 SSE4.2 指令集补充 pentium_pro、SSE、SSE2、SSE3、SSSE3 和 SSE4.1 指令集。&
使用 AMD SSE4a 指令集。&
B.2.74.3 x86 特殊注意事项
Solaris 平台进行编译时,有一些重要问题值得注意。
xarch 设置为 -sse、sse2、sse2a、sse3 或更高时编译的程序只能在提供这些扩展和功能的平台上运行。
在 Pentium 4 兼容的平台上 Solaris OS 发行版支持 SSE/SSE2。早期版本的 Solaris OS 不支持 SSE/SSE2。如果所运行的 Solaris OS 不支持由 -xarch 选定的指令集,则编译器无法为该指令集生成链接代码。
如果在单独的步骤中编译和链接,请始终使用编译器以及相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
x86 上的数值结果可能与 SPARC 上的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
因为内部数学库(例如,sin(x))不同,所以 Solaris 和 Linux 之间的数值结果也会不同。
B.2.74.4 二进制兼容验证
从 Solaris Studio 11 和 Solaris 10 OS 开始,会对使用这些专用的 -xarch 硬件标志编译和生成的程序二进制文件进行验证,看其是否在相应的平台上运行。
在 Solaris 10 之前的系统中,不执行任何验证,用户负责确保使用这些标志生成的对象部署在合适的硬件上。
如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch
选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
这一警告也扩展到使用 .il 内联汇编语言功能或使用 SSE、SSE2、SSE2a 和 SSE3 指令和扩展的 __asm() 汇编程序代码。
B.2.74.5 交互
尽管可以单独使用该选项,但它是 -xtarget 选项的扩展的一部分,并且可用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。例如,-xtarget=ultra2 可扩展为 -xarch=sparcvis -xchip=ultra2 -xcache=16/32/1:512/64/1。在以下命令中, -xarch=generic 覆盖了由 -xtarget=ultra2 的扩展设置的 -xarch=sparcvis。
example% cc -xtarget=ultra2 -xarch=generic foo.c
B.2.74.6 警告
如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件。但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
B.2.75 -xautopar
注 & 此选项不能启动 OpenMP 并行化指令。
为多个处理程序打开自动并行化。执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构。如果优化级别不是 -xO3 或更高级别,则将优化级别提高到 -xO3 并发出警告。
如果要进行自己的线程管理,请勿使用 -xautopar。
为了使执行速度更快,该选项要求使用多处理器系统。在单处理器系统中,生成的二进制文件的运行速度通常较慢。
要在多线程环境中运行已并行化的程序,必须在执行之前设置 OMP_NUM_THREADS环境变量。有关更多信息,请参见《Solaris Studio 12 Update 1:OpenMP API 用户指南》。
如果使用 -xautopar 且在一个步骤中进行编译和链接,则链接会自动将微任务化库和线程安全的 C 运行时库包含进来。如果使用 -xautopar,而且在不同的步骤中进行编译和链接,则还必须使用 -xautopar 进行链接。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见。
B.2.76 -xbinopt={prepare| off}
(SPARC) 指示编译器准备二进制文件,以便以后进行优化、转换和分析,请参见 binopt(1)。此选项可用于生成可执行文件或共享对象。此选项必须与 -xO1 或更高的优化级别一起使用时才有效。使用此选项生成二进制文件时,文件大小会有所增加。
如果在不同的步骤中进行编译,则在编译步骤和链接步骤中都必须有 -xbinopt:
example% cc -c -xO1 -xbinopt=prepare a.c b.c
example% cc -o myprog -xbinopt=prepare a.o
如果有些源代码不可用于编译,仍可使用此选项来编译其余代码。然后,应将其用于可创建最终库的链接步骤中。在此情况下,只有用此选项编译的代码才能进行优化、转换或分析。
使用 -xbinopt=prepare 和 -g 编译会将调试信息包括在内,从而增加可执行文件的大小。缺省值为 -xbinopt=off。
B.2.77 -xbuiltin[=( %all|%none)]
如果要改进调用标准库函数的代码的优化,请使用 -xbuiltin[=(%all|%none)] 命令。很多标准库函数(例如在 math.h 和 stdio.h 中定义的函数)通常由多个程序使用。此命令使编译器可在对性能有益时替换内函数或内联系统函数。有关如何读取目标文件中的编译器注解来确定编译器实际对哪些函数进行替换的说明,请参见 er_src(1) 手册页。
但是,这些替换会使 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。另请参见。
如果不指定 -xbuiltin,则缺省值为 -xbuiltin=%none,该值表示不替换或内联标准库中的任何函数。如果指定 -xbuiltin,但未提供任何参数,则缺省值为 -xbuiltin%all,该值表示编译器在确定优化好处时替换内部函数或内联标准库函数。
如果使用 -fast 进行编译,则 -xbuiltin 设置为 %all。
-xbuiltin 仅内联系统头文件中定义的全局函数,从不内联用户定义的静态函数。
B.2.78 -xCC
当指定 -xc99=none 和 -xCC 时,编译器将接受 C++ 样式注释。特别是,可使用 // 指示注释的开始。
B.2.79 -xc99[= o]
-xc99 选项可控制编译器对根据 C99 标准(ISO/IEC ,编程语言 - C)实现的功能的识别。
o 可以是包含以下内容的以逗号分隔的列表:
-xc99 标志
[不] 启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准例程库语义。&
打开识别支持的 C99 语言功能,并启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。&
关闭识别支持的 C99 语言功能,并且不启用同时在 1990 和 1999 C 标准中出现的例程的 1999 C 标准库语义。&
如果未指定 -xc99,编译器缺省采用 -xc99=all,no_lib。如果指定了 -xc99,但没有指定任何值,该选项将设置为 -xc99=all。
注 & 虽然编译器支持级别缺省为 C99 标准的语言功能,但 /usr/include 中的 Solaris 8 和 Solaris 9 操作系统提供的标准头文件不符合 1999 ISO/IEC C 标准。如果遇到错误消息,请尝试指定
-xc99=none,从而获取这些头文件的 1990 ISO/IEC C 标准行为。
出现在 1999 和 1999 C 标准中的 1990 C 标准例程库语义不可用,因此无法在 Solaris 8 和 Solaris 9 软件中启用。在 Solaris 8 或 Solaris 9 软件上直接或间接指定 -xc99=lib 时,编译器会发出错误消息。
B.2.80 -xcache[= c]
定义可供优化器使用的缓存属性。此选项不保证使用每个特定的缓存属性。
注 & 尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
此发行版引入一个可选属性 [/ti],该属性用来设置可以共享缓存的线程数。如果没有为 t 指定值,则缺省值为 1。
c 必须是以下值之一:
s1/ l1/a 1[/t1]
s1/ l1/a 1[/t1]: s2/l 2/a2[ /t2]
s1/ l1/a 1[/t1]: s2/l 2/a2[ /t2]: s3/l 3/a3[ /t3]
s/l /a/t 属性定义如下:
级别为 i 的数据高速缓存的大小,以千字节为单位
级别为 i 的数据高速缓存的行大小,以字节为单位
级别为 i 的数据高速缓存的关联性
共享级别为 i 的缓存的硬件线程数
下表列出了 -xcache 值。
-xcache 标志
这是缺省值,该值指示编译器使用能达到以下效果的缓存属性:多数 x86 和 SPARC 处理器上都能获得良好性能,同时任何处理器性能都不会明显下降。&
如果需要,在每个新的发行版本中都会调整最佳定时属性。&
设置在主机环境中最佳性能的参数。&
s1/l1 /a1[/t1]
定义 1 级高速缓存属性。&
s1/l1 /a1[/t1] :s2/l2 /a2[/t 2]
定义 1 级和 2 级高速缓存属性。&
s1/l1 /a1[/t1] :s2/l2 /a2[/t 2]:s3/ l3/a3[/ t3]
定义 1 级、2 级和 3 级缓存属性。&
示例: -xcache=16/32/4: 指定以下内容:
级别 1 缓存具有以下属性:&
16 千字节&
32 字节行大小&
4 方向关联&
2 级缓存具有:&
1024 千字节&
32 字节行大小&
指示映射关联&
B.2.81 &xcg[89|92]
(SPARC) 已废弃。您不该使用此选项。当前的 Solaris 操作系统不再支持 SPARC V7 体系结构。使用此选项编译生成的代码在当前的 SPARC 平台中运行较慢。应改用 -O,并利用 -xarch、-xchip 和 -xcache 编译器缺省值。
B.2.82 -xchar[= o]
提供此选项仅仅是为了便于从将字符类型定义为无符号的系统中迁移代码。如果不是从这样的系统中迁移,最好不要使用该选项。只有那些依赖字符类型符号的程序才需要重写,它们要改写成显式指定带符号或者无符号。
o 可以是下列值之一:
-xchar 标志
将声明为字符的字符常量和变量视为带符号的。这会影响已编译代码的行为,而不影响库例程的行为。&
与 signed 等效。
将声明为字符的字符常量和变量视为无符号的。这会影响已编译代码的行为,而不影响库例程的行为。&
与 unsigned 等效。
如果未指定 -xchar,编译器将假定
-xchar=s。
如果指定了 -xchar 但未指定值,编译器将假定 -xchar=s。
-xchar 选项仅更改用 -xchar 编译的代码中类型 char 的值范围。该选项不更改任何系统例程或头文件中类型 char 的值范围。具体来讲,指定选项时不更改 limits.h 定义的 CHAR_MAX 和 CHAR_MIN 的值。因此,CHAR_MAX 和 CHAR_MIN 不再表示无格式字符中可编码的值的范围。
如果使用 -xchar,则在将字符与预定义的系统宏进行比较时要特别小心,原因是宏中的值可能带符号。任何返回错误代码而且可以用宏来访问错误代码的例程通常是这样的。错误代码一般是负值,因此在将字符与此类宏中的值进行比较时,结果始终为假。负数永远不等于无符号类型的值。
强烈建议不要使用 -xchar 为通过库导出的任何接口编译例程。Solaris ABI 将类型 char 指定为带符号,并且系统库也按此指定。还未对系统库针对将 char 指定为无符号的效果进行广泛测试。可以不使用该选项,而修改您的代码使其不依赖于类型 char 是否带符号。类型 char 的符号因不同的编译器和操作系统而不同。
B.2.83 -xchar_byte_order[= o]
以指定的字节顺序放置多字符字符常量构成的字符,以生成一个整型常量。可将 o 替换成下列值之一:
low:按由低到高的字节顺序放置多字符字符常量构成的字符。
high: 按由高到低的字节顺序放置多字符字符常量构成的字符。
default: 按编译模式所确定的顺序放置多字符字符常量构成的字符。有关更多信息,请参见。
B.2.84 -xcheck[= o]
添加针对栈溢出的运行时检查并初始化局部变量。
可将 o 替换成下列值之一:
-xcheck 标志
不执行任何 -xcheck 检查。
执行全部 -xcheck 检查。
启用栈溢出检查。-xcheck=stkovf 将添加针对单线程程序中的主线程以及多线程程序中的从属线程栈的栈溢出运行时检查。如果检测到栈溢出,则生成 SIGSEGV。如果您的应用程序需要以不同于处理其他地址空间违规的方式处理栈溢出导致的 SIGSEGV,请参见 sigaltstack(2)。
关闭栈溢出检查。&
init_local
初始化局部变量。有关详细信息,请参见以下介绍。&
no%init_local
不初始化局部变量。&
如果未指定 -xcheck,则编译器缺省使用 -xcheck=%none。如果指定了没有任何参数的 -xcheck,则编译器缺省使用 -xcheck=%all。
在命令行上 -xcheck 选项不进行累积。编译器按照上次出现的命令设置标志。
B.2.84.1 -xcheck=init_local 的初始化值
使用 -xcheck=init_local,编译器在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值:(注意这些值会发生更改,因此不应该依赖它们。)
基本类型表&B&20
基本类型的 init_local 初始化
Char, __Bool
int, long, enum &&& (-m32)
0xff80002b
long &&&(-m64)
0x0001 (-m64)
float, float _Imaginary
0xff800001
float _Complex
0xff80000fff800011
SPARC: 0xfff0
x86: 0xfff0
double _Imaginary
long double, long double _Imaginary
SPARC: 0xffff / 0xfff0000bff80000d
x86: 12 bytes (-m32): 0x0005 /
0x0000ffff
x86 - 16 bytes (-m64): 0x0005 /
0x0000ffff
double _Complex
0xfff0 / 0xfff0
long double _Complex
SPARC: 0xffff001bff80001d / 0xfff0001fff800021 /
0xffff / 0xfff0
x86 - 12 bytes (-m32): 0x7fffb01bff80001d /
0x00007fff / 0x7fffb023ff800025 / 0x00007fff
x86 - 16 bytes (-m64): 0x00007fff /
0x1b1d1f / 0x00007fff /
注意,为结合计算的 goto 使用而声明的局部变量(即简单的 void * 指针),将根据上表中所述的指针说明进行初始化。
永远不会初始化以下局部变量类型:限定的 const、register、计算的 goto 的标签号、局部标签、可变长度数组 (VLA)
初始化结构、联合和数组
struct 中作为基本类型的域将根据上表中所述进行初始化,union 中第一个声明的 pointer 或 float 域也是如此。这样便最大程度地增加了未初始化引用生成可见错误的可能性。
数组元素也按上表所述进行初始化。
按如上所述对内嵌 struct、union、数组域进行初始化,但以下情况除外:struct
包含位域,union 没有 pointer 或 float 域,或者数组类型无法进行完整的初始化。将使用用于类型 double 的局部变量的值对它们进行初始化。不对可变长度组数进行初始化。
B.2.85 -xchip[= c]
指定供优化器使用的目标处理器。
c 必须是以下值之一: generic、old、super、super2、micro、micro2、hyper、hyper2、powerup、ultra、 ultra2、ultra2e、ultra2i、ultra3、ultra3cu、pentium、pentium_pro。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
此选项通过指定目标处理器来指定计时属性。其部分影响表现在以下方面:
指令的顺序,即调度
编译器使用分支的方法
语义上等价的其他指令可用时使用的指令
下表列出了用于 SPARC 平台的 -xchip 值:
SPARC -xchip 标志
使用计时属性,以便在大多数 SPARC 体系结构上获得良好性能。&
这是缺省值,该值指示编译器使用最佳计时属性以便在多数处理器上获得良好性能,而不会使任何处理器性能明显下降。&
设置在主机环境中最佳性能的参数。&
使用 SuperSPARC 以前的处理器的计时属性。&
针对 SPARC64 VI 处理器进行优化。&
sparc64vii
针对 SPARC64 VII 处理器进行优化&
使用 SuperSPARC 处理器的计时属性。&
使用 SuperSPARC II 处理器的计时属性。&
使用 microSPARC 处理器的计时属性。&
使用 microSPARC II 处理器的计时属性。&
使用 hyperSPARC 处理器的计时属性。&
使用 hyperSPARC II 处理器的计时属性。&
使用 Weitek PowerUp 处理器的计时属性。&
使用 UltraSPARC 处理器的计时属性。&
使用 UltraSPARC II 处理器的计时属性。&
使用 UltraSPARC IIe 处理器的计时属性。&
使用 UltraSPARC IIi 处理器的计时属性。&
使用 UltraSPARC III 处理器的计时属性。&
使用 UltraSPARC III Cu 处理器的计时属性。&
使用 UltraSPARC IIIi 处理器的计时属性。&
使用 UltraSPARC IV 处理器的计时属性。&
ultra4plus
使用 UltraSPARC IVplus 处理器的计时属性。&
使用 UltraSPARC T1 处理器的计时属性。&
使用 UltraSPARC T2 处理器的计时属性。&
ultraT2plus
使用 UltraSPARC T2+ 处理器的计时属性。&
使用 UltraSPARC T3 处理器的计时属性。&
下表列出了用于 x86 平台的 -xchip 值:
x86 -xchip 标志
使用计时属性,以便在大多数 x86 体系结构上获得良好性能。&
这是缺省值,该值指示编译器使用最佳计时属性以便在多数处理器上获得良好性能,而不会使任何处理器性能明显下降。&
设置在主机环境中最佳性能的参数。&
针对 Intel Core2 处理器进行优化。&
针对 Intel Nehalem 处理器进行优化。&
针对 AMD Opteron 处理器进行优化。&
针对 Intel Penryn 处理器进行优化。&
使用 x86 pentium 体系结构的计时属性。&
pentium_pro
使用 x86 pentium_pro 体系结构的计时属性。&
使用 x86 Pentium 3 体系结构的计时属性。&
使用 x86 Pentium 4 体系结构的计时属性。&
针对 AMD AMDFAM10 处理器进行优化。&
B.2.86 -xcode[= v]
(SPARC) 指定代码地址空间。
注 & 强烈建议您通过指定 -xcode=pic13 或 -xcode=pic32 来生成共享对象。可以使用 -xarch=v9 -xcode=abs64 和 -xarch=v8 -xcode=abs32 生成可用的共享对象,但这样做效率很低。用 -xarch=v9、-xcode=abs32 或 -xarch=v9、-xcode=abs44 生成的共享对象无法工作。
v 必须是以下项之一:
-xcode 标志
这是 32 位体系结构的缺省值。生成 32 位绝对地址。代码 + 数据 + bss 的大小被限制为 2**32 字节。 &
这是 64 位体系结构的缺省值。生成 44 位绝对地址。代码+数据+bss 的大小不应超过 2**44 字节。只适用于 64 位体系结构。&
生成 64 位绝对地址。只适用于 64 位架构。&
生成共享库(小模型)中使用的与位置无关的代码。与 -Kpic 等效。允许在 32 位体系结构中最多引用 2**11 个唯一的外部符号,而在 64 位体系结构中可以最多引用 2**10 个。
生成共享库(大模型)中使用的与位置无关的代码。与 -KPIC 等效。允许在 32 位体系结构中最多引用 2**30 个唯一的外部符号,而在 64 位体系结构中可以最多引用 2**29 个。
对于 32 位体系结构,缺省值是 -xcode=abs32。64 位体系结构的缺省值是 -xcode=abs44。
生成共享动态库时,缺省 -xcode 值 abs44 和 abs32 将与 64 位体系结构一起使用。但指定 -xcode=pic13 或 -xcode=pic32。在 SPARC 上使用 -xcode=pic13 和 -xcode=pic32 时,存在两项名义性能成本。
用 -xcode=pic13 或 -xcode=pic32 编译的例程会在入口点执行一些附加指令,以便将寄存器设置为指向用于访问共享库的全局或静态变量的表 (_GLOBAL_OFFSET_TABLE_)。
对全局或静态变量的每次访问都会涉及通过 _GLOBAL_OFFSET_TABLE_ 的额外间接内存引用。如果编译包括 -xcode=pic32,则每个全局和静态内存引用中都会有两个附加指令。
在考虑上述成本时,请记住:由于受到库代码共享的影响,使用 -xcode=pic13 和 -xcode=pic32 会大大减少系统内存需求。共享库中使用 -xcode=pic13 或 & xcode=pic32 编译的每页代码都可以供使用该库的每个进程共享。如果共享库中的代码页包含非 pic(即绝对)内存引用,即使仅包含单个非 pic 内存引用,该页也将变为不可共享,而且每次执行使用该库的程序时都必须创建该页的副本。
确定是否已经使用 -xcode=pic13 或 -xcode=pic32 编译 .o 文件的最简单方法是使用 nm 命令:
% nm file.o | grep _GLOBAL_OFFSET_TABLE_ U _GLOBAL_OFFSET_TABLE_
包含与位置无关的代码的 .o 文件将包含对 _GLOBAL_OFFSET_TABLE_ 无法解析的外部引用(用字母 U 标记)。
要确定使用 -xcode=pic13 还是 -xcode=pic32,请使用 elfdump -c(有关更多信息,请参见 elfdump(1) 手册页)检查全局偏移表 (Global Offset Table, GOT) 的大小并查找节标题 sh_name: .got。sh_size 值是 GOT 的大小。如果 GOT 小于 8,192 字节,请指定 -xcode=pic13,否则指定 -xcode=pic32。
通常,应根据以下准则来确定如何使用 -xcode:
如果是生成可执行文件,则不应该使用 &
xcode=pic13 或 -xcode=pic32。
如果是生成仅用于链接到可执行文件的归档库,则不应该使用 -xcode=pic13 或 -xcode=pic32。
如果要生成共享库,请先使用 -xcode=pic13,一旦 GOT 大小超过 8,192 字节,再使用 -xcode=pic32。
如果要生成用于链接到共享库的归档库,则应该使用 -xcode=pic32。
B.2.87 -xcrossfile
已废弃,不使用。改用 -xipo。-xcrossfile 是 -xipo=1 的别名。
B.2.88 -xcsi
允许 C 编译器接受在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。这些语言环境包括: ja_JP.PCK。
处理此类语言环境所需的编译器转换阶段可能导致编译时间明显延长。仅当编译的源文件包含此类语言环境中某个语言环境的源代码字符时,才应该使用此选项。
除非指定 -xcsi,否则编译器不识别在不符合 ISO C 源字符代码要求的语言环境中编写的源代码。
B.2.89 -xdebugformat=[stabs|dwarf]
如果您维护会读取 dwarf 格式的调试信息的软件,请指定 -xdebugformat=dwarf。使用此选项,编译器会生成使用 dwarf 标准格式的调试信息,这是缺省设置。
-xdebugformat 标志
-xdebugformat=stabs 生成使用 stabs 标准格式的调试信息。
-xdebugformat=dwarf 使用 dwarf 标准格式(缺省设置)生成调试信息。
如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。此选项需要一个参数。
此选项影响使用 -g 选项记录的数据的格式。即使在没有使用 -g 的情况下记录少量调试信息,此选项仍可控制其信息格式。因此,即使不使用 -g,-xdebugformat 仍有影响。
dbx 和性能分析器软件可识别 stabs 和 dwarf 格式,因此使用此选项对任何工具的功能都没有影响。
有关更多信息,另请参见 dumpstabs(1) 和 dwarfdump(1)
B.2.90 -xdepend=[yes| no]
分析循环以了解迭代间数据依赖性并执行循环重构,包括循环交互、循环熔合以及标量替换。
对于所有优化级别 -xO3 以及更高级别,-xdepend 缺省为 -xdepend=on。指定 -xdepend 的显式设置会覆盖任何缺省设置。
指定不带参数的 -xdepend 等效于 -xdepend=yes。
依赖性分析在单处理器系统中可能很有用。但是,如果您在单处理器系统上使用 -xdepend,则不应同时指定 -xautopar,否则会针对多处理器系统执行 -xdepend 优化。
B.2.91 -xdryrun
此选项是用于 -### 的宏。
B.2.92 -xe
对源文件仅执行语法和语义检查,但不生成任何目标或可执行代码。
B.2.93 -xF[=v[,v...]]
由链接程序对函数和变量进行最优的重新排序。
该选项指示编译器将函数和/或数据变量放置到单独的分段中,这使链接程序(使用链接程序的 -M 选项指定的映射文件中的指示)将这些段重新排序以优化程序性能。通常,该优化仅在缺页时间构成程序运行时间的一大部分时才有效。
对变量重新排序有助于解决对运行时性能产生负面影响的以下问题:
在内存中存放位置很近的无关变量会造成缓存和页的争用。
在内存中存放位置很远的相关变量会造成不必要的过大工作集。
未用到的弱变量副本会造成不必要的过大工作集,从而降低有效数据密度。
为优化性能而对变量和函数进行重新排序时,需要执行以下操作:
使用 -xF 进行编译和链接。
按照《程序性能分析工具》手册中关于如何生成函数的映射文件(或&链接程序和库向导&中关于如何生成数据的映射文件)的说明进行操作。
使用通过链接程序的 -M 选项生成的新映射文件重新链接。
在分析器下重新执行以验证是否增强。
B.2.93.1 值
v 可以是下列其中一个或多个值:
[不] 将函数分段到单独的段中。&
[no%]gbldata
[不] 将全局数据(具有外部链接的变量)分段到单独的段中。&
[no%]lcldata
[不] 将局部数据(具有内部链接的变量)分段到单独的段中。&
分段函数、全局数据和局部数据。&
如果未指定 -xF,则缺省值为 -xF=%none。如果指定了没有任何参数的 -xF,则缺省值为 -xF=%none,func。
使用 -xF=lcldata 会限制某些地址计算优化,因此,只应在必要时才使用该标志。
请参见 analyzer(1) 和 ld(1) 手册页。
B.2.94 -xhelp=f
显示联机帮助信息。
f 必须为 flags 或 readme。
-xhelp=flags 显示编译器选项汇总信息。
-xhelp=readme 显示 README 文件。
B.2.95 -xhwcprof
(SPARC) 使编译器支持基于硬件计数器的文件配置。
如果启用了 -xhwcprof,编译器将生成信息,这些信息可帮助工具将文件配置的加载和存储指令与其所引用的数据类型和结构成员相关联(与由 -g 生成的符号信息一起)。它将配置文件数据同目标文件的数据空间(而不是指令空间)相关联,并对行为进行洞察,而这仅从指令配置中是无法轻易获得的。
可使用 -xhwcprof 编译一组指定的目标文件。但是,-xhwcprof 在应用于应用程序中的所有目标文件时,作用最大。它能全面识别并关联分布在应用程序目标文件中的所有内存引用。
如果分别在单独的步骤中进行编译和链接,最好在链接时使用 -xhwcprof。如果将来扩展为 -xhwcprof,则在链接时可能需要使用它。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见。
-xhwcprof=enable 或 -xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。
在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof 与 -xhwcprof=enable 等效。
-xhwcprof 要求启用优化并将调试数据的格式设置为 DWARF (-xdebugformat=dwarf)。
-xhwcprof 和 -g 的组合会增加编译器临时文件的存储需求,而且比单独指定 -xhwcprof 和 -g 所引起的增加总量还多。
下列命令可编译 example.c,并可为硬件计数器文件配置以及针对使用 DWARF 符号的数据类型和结构成员的符号分析指定支持:
example% cc -c -O -xhwcprof -g -xdebugformat=dwarf example.c
有关基于硬件计数器的文件配置的更多信息,请参见《程序性能分析工具》手册。
B.2.96 -xinline=list
用于 -xinline 的 list 的格式如下所示:[{%auto,func_name ,no%func_name}[,{%auto ,func_name,no%func_name}]...]
-xinline 尝试只内联可选列表中指定的函数。该列表可为空,或者由逗号分隔的 func_name、no%func_name 或
%auto 列表组成,其中
func_name 是函数名称。仅在 -xO3 或更高级别上,-xinline 才起作用。
-xinline 标志
指定编译器将尝试自动内联源文件中的所有函数。仅在
-xO4 或更高优化级别上,%auto 才起作用。在 -xO3 或更低优化级别上,%auto 被忽略而无提示。
指定编译器内联已命名的函数。&
no%func_name
指定编译器不内联已命名的函数。&
该列表值从左至右进行累积。因此对于 -xinline=%auto,no%foo 的规范,编译器试图内联除 foo 之外的所有函数。对于 -xinline=%bar,%myfunc,no%bar 的规范,编译器仅尝试内联 myfunc。
在优化级别为 -xO4 或更高级别上编译时,编译器通常尝试内联源文件中定义的对函数的所有引用。通过指定 -xinline 选项,您可以限定编译器试图内联的函数集。如果只指定 -xinline=,即不指定任何函数或 %auto,这表示不内联源文件中的任何例程。如果您指定了一系列 func_name 和 no%func_name,而未指定 %auto,则编译器只试图内联列表中指定的函数。如果在优化级别设置为 -xO4 或更高级别时用 -xinline 选项在值列表中指定 %auto,编译器将试图内联所有未被 no%func_name 显式排除的函数。
如果以下任何条件适用,则不内联函数。且不发出任何警告。
优化级别低于 -xO3。
无法找到例程。
优化器无法内联例程。
正编译的文件中不存在该例程的源代码(请参见 -xcrossfile)。
如果在命令行指定多个 -xinline 选项,它们将不会累积。命令行上的最后一个 -xinline 指定编译器试图内联的函数。
另请参见 -xldscope。
B.2.97 -xinstrument=[ no%]datarace
指定此选项编译您的程序并为其提供程序设备,以供线程分析器进行分析。有关线程分析器的更多详细信息,请参见 tha(1)。
然后可使用性能分析器以
collect -r races 来运行此检测的程序,从而创建数据竞争检测实验。可以单独运行已提供了程序设备的代码,但其运行速度将非常缓慢。
可指定 -xinstrument=no%datarace 来关闭线程分析器的源代码准备。这是缺省值。
指定 -xinstrument 而不带参数是非法操作。
如果在不同的步骤中进行编译和链接,则在编译和链接步骤都必须指定 -xinstrument=datarace。
此选项定义了预处理程序令牌 __THA_NOTIFY。可指定 #ifdef __THA_NOTIFY 来保护对 libtha(3) 例程的调用。
该选项也设置 -g。
B.2.98 -xipo[= a]
用 0、1 或 2 替换 a。没有任何参数的 -xipo 等效于 -xipo=1。-xipo=0 是缺省设置,表示关闭 -xipo。在 -xipo=1 时,编译器会跨所有源文件执行内联。
在 -xipo=2 时,编译器执行过程间调用别名分析同时优化内存分配和布局,以提高缓存的性能。
编译器可通过调用过程间分析组件执行部分程序优化。它在链接步骤中跨所有目标文件执行优化,并且不限于编译命令的源文件。但是,使用 -xipo 执行的整个程序优化不包括汇编 (.s) 源文件。
编译时和链接时都必须指定 -xipo。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见。
由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的目标文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加都是由于执行的附加优化导致的。在编译步骤中创建的目标文件具有在这些文件内编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。
在编译和链接大型多文件应用程序时,-xipo 特别有用。用该标志编译的对象目标文件具有在这些文件内编译的分析信息,这些信息实现了在源码和预编译的程序文件中的过程间分析。
但分析和优化只限于使用 -xipo 编译的目标文件,并不扩展到目标文件或库。
-xipo 是多阶段的,因此如果要在单独的步骤中进行编译和链接,需要为每一步指定 -xipo。
关于 -xipo 的其他重要信息:
它要求优化级别最低为 -xO4。
编译时未使用 -xipo 的对象可以自由地与使用 -xipo 编译的对象链接。
B.2.98.1 示例
在此例中,编译和链接在单独的步骤中进行:
cc -xipo -xO4 -o prog part1.c part2.c part3.c
优化器在三个源文件之间执行交叉文件内联。这是在最终链接步骤中完成的,因此源文件的编译不必全部在单个编译中进行,可以通过多个单独的编译来进行,且每个编译都要指定 -xipo。
在此例中,编译和链接在单独的步骤中进行:
cc -xipo -xO4 -c part1.c part2.c
cc -xipo -xO4 -c part3.c
cc -xipo -xO4 -o prog part1.o part2.o part3.o
即使用 -xipo 编译,仍存在库不参与交叉文件过程间分析的约束,如下例所示:
cc -xipo -xO4 one.c two.c three.c
ar -r mylib.a one.o two.o three.o
cc -xipo -xO4 -o myprog main.c four.c mylib.a
在此例中,过程间调用优化是在以下例程之间执行的:one.c、two.c 和 three.c 之间,main.c 和 four.c 之间,但不在 main.c 或 four.c 和 mylib.a 上的例程之间执行。(第一次编译可能产生未定义符号警告,但是由于它是编译与链接步骤,所以会执行过程间调用优化。)
B.2.98.2 何时不使用 -xipo=2 过程间分析
在链接步骤中使用目标文件集合时,编译器试图执行整个程序分析和优化。对于该目标文件集合中定义的任何函数或子例程 foo(),编译器做出以下两个假定:
foo() 无法在运行时被在该目标文件集合之外定义的其他例程显式调用。
来自该目标文件集合中的任何例程的 foo() 调用将不受在该目标文件集合以外定义的不同版本的 foo() 的干预。
如果假定 2 不成立,请不要使用 -xipo=1 也不要使用 -xipo=2 进行编译。
例如,如果对函数 malloc() 创建了您自己的版本,并使用 -xipo=2 进行编译。这样,对于任何库中引用 malloc() 且与您的代码链接的所有函数,都必须使用 -xipo=2 进行编译,并且需要在链接步骤中对其目标文件进行操作。由于这对于系统库不大可能,因此不要使用 -xipo=2 编译您的 malloc 版本。
另举一例,如果生成了一个共享库,有两个外部调用(foo() 和 bar())分别在两个不同的源文件中。并假设 bar() 调用 foo()。如果可能会在运行时插入 foo(),则不要使用 -xipo=1 或 -xipo=2 编译 foo() 和 bar() 的源文件。否则,foo() 会内联到 bar() 中,从而导致出现错误的结果。
B.2.99 -xipo_archive=[a]
-xipo_archive 选项使编译器可在生成可执行文件之前,用通过 -xipo 编译且驻留在归档库 (.a) 中的目标文件来优化传递给链接程序的目标文件。库中包含的在编译期间优化的任何目标文件都会替换为其优化后的版本。
a 是以下项之一:
-xipo_archive 标志
生成可执行文件之前,编译器使用通过 -xipo 编译的目标文件(驻留在归档库 (.a) 中)来优化传递到链接程序的目标文件。库中包含的在编译期间优化的任何目标文件都会替换为优化后的版本。
对于使用归档库通用集的并行链接,每个链接都应创建自己的归档库备份,从而在链接前进行优化。&
生成可执行文件之前,编译器使用通过 -xipo 编译的目标文件(驻留在归档库 (.a) 中)来优化传递到链接程序的目标文件。
通过 -xipo_archive=readonly 选项,可在链接时指定的归档库中进行对象文件的跨模块内联和程序间数据流分析。但是,它不启用对归档库代码的跨模块优化,除非代码已经通过跨模块内联插入到其他模块中。
要对归档库内的代码应用跨模块优化,要求 -xipo_archive=writeback。请注意,这样做将修改从中提取代码的归档库的内容。
这是缺省值。没有对归档文件的处理。编译器不对使用 -xipo 编译和在链接时从归档库中提取的对象文件应用跨模块内联或其他跨模块优化。要执行此操作,链接时必须指定 -xipo,以及 -xipo_archive=readonly 或
-xipo_archive=writeback 中的任一个。
如果不为 -xipo_archive 指定设置,编译器会将其设置为 -xipo_archive=none。
指定不带标志的 -xipo_archive 是非法的。
B.2.100 -xjobs=n
指定 -xjobs 选项,以设置编译器为完成工作需要创建的进程数。在多 CPU 计算机上,该选项可以缩短生成时间。目前,-xjobs 只能与 -xipo 选项一起使用。如果指定 -xjobs=n,过程间优化器就将 n 作为其在编译不同文件时可调用的最大代码生成器实例数。
通常,n 的安全值等于 1.5 乘以可用处理器数。如果使用的值是可用处理器数的数倍,则会降低性能,因为有在产生的作业间进行的上下文切换开销。此外,如果使用很大的数值会耗尽系统资源(如交换空间)。
指定 -xjobs 时务必要指定值。否则会发出错误诊断并使编译终止。
出现最合适的实例之前,-xjobs 的多重实例在命令行上会互相覆盖。
以下示例在有两个处理器的系统上进行的编译,速度比使用相同命令但没有 -xjobs 选项时进行的编译快。
example% cc -xipo -xO4 -xjobs=3 t1.c t2.c t3.c
指定不带标志的 -xipo_archive 是非法的。
B.2.101 -xldscope={v}
指定 -xldscope 选项,以更改用于外部符号定义的缺省链接程序作用域。由于实现更隐蔽,因此更改缺省值可使共享库更快、更安全。
v 必须是下列值之一:
-xldscope 标志
全局链接程序作用域是限制最少的链接程序作用域。该符号的所有引用都绑定到在第一个动态模块中定义该符号的定义上。该链接程序作用域是外部符号的当前链接程序作用域。&
符号链接程序作用域比全局链接程序作用域具有更多的限制。从所链接的动态模块内部对符号的所有引用都绑定到在模块内部定义的符号上。在模块外部,符号也显示为全局符号。该链接程序作用域对应于链接程序选项 -Bsymbolic。有关链接程序的更多信息,请参见 ld(1)。
隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制。动态模块内部的所有引用都绑定到该模块内部的一个定义上。符号在模块外部是不可视的。&
如果未指定 -xldscope,编译器将假定
-xldscope=global。如果指定不带参数的 -xldscope,编译器会发出错误信息。在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖。
如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。编译程序在以下情况下将内联函数:用 -xinline 指定函数的名称、在可以自动内联的 -xO4 或更高级别进行编译、使用内联说明符、使用内联 pragma 或者使用交叉文件优化。
例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:
void* ABC_allocator(size_t size) { return malloc(size); }
如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库的客户端要用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。
生成库时,用 __hidden 或 __symbolic 说明符声明的库函数可以内联生成。假定这些库函数不被客户端覆盖。请参见。
用 __global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。
另请参见 -xinline、-xO、-xcrossfile、#pragma、inline。
B.2.102 -xlibmieee
强制为异常类中的数学例程返回 IEEE 754 样式的值。在此情况下,不输出异常消息,并且不应依赖 errno。
B.2.103 -xlibmil
内联一些库例程,以加快执行速度。此选项可为浮点选项和系统平台选择合适的汇编语言内联模板。
无论将函数的任何规范作为 -xlibmil 标记的一部分,-xlibmil 都会内联函数。
但是,这些替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请尽量不要使用此选项。另请参见。
B.2.104 -xlibmopt
使编译器可以使用优化数学例程的库。使用此选项时,必须通过指定 -fround=nearest 来使用缺省舍入模式。
数学例程库优化了性能,并且通常会生成运行速度更快的代码。结果可能与普通数学库产生的结果略有不同。如果有差别,通常是最后一位不同。
但是,这些替换会使 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。另请参见。
该库选项在命令行上的顺序并不重要。
此选项由 -fast 选项设置。
另请参见:-fast -xnolibmopt
B.2.105 -xlic_lib=sunperf
Solaris Studio 提供的性能库中的链接。
B.2.106 -xlicinfo
编译器忽略此选项且不显示任何提示。
B.2.107 -xlinkopt[= level]
(SPARC) 指示编译器对可重定位的目标文件执行链接时优化。这些优化在链接时通过分析二进制目标代码来执行。虽然未重写目标文件,但生成的可执行代码可能与初始目标代码不同。
必须至少在部分编译命令中使用 -xlinkopt,才能使 -xlinkopt 在链接时有效。优化器仍可以对未使用 -xlinkopt 进行编译的二进制目标文件执行部分受限的优化。
-xlinkopt 优化出现在编译器命令行上的静态库代码,但会跳过出现在命令行上的共享(动态)库代码而不对其进行优化。还可以在生成共享库(用 -G 编译)时使用 -xlinkopt。
级别设置执行的优化级别,必须为 0、1 或 2。优化级别为:
-xlinkopt 标志
禁用后优化器。(这是缺省情况。)&
在链接时根据控制流分析执行优化,包括指令高速缓存着色和分支优化。&
在链接时执行附加的数据流分析,包括无用代码删除和地址计算简化。&
如果在不同的步骤中编译,-xbinopt 必须同时出现在编译和链接步骤中:
example% cc -c -xlinkopt a.c b.c
example% cc -o myprog -xlinkopt=2 a.o
有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见。
请注意,仅当编译器链接时才使用级别参数。在以上示例中,即使二进制目标代码是用隐含级别 1 编译的,使用的后优化级别仍然是 2。
指定 -xlinkopt 时若不带级别参数,则表示
-}

我要回帖

更多关于 怎么批量更改文件名 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信