CC - C++ 编译器
CC [-#] [-] [-B{dynamic|static|symbolic}] [-c] [-compat[={5|g}]] [+d] [-Dname[=def]] [-d{y|n}] [-dalign] [-dryrun] [-E] [-erroff[=t[,t...]]] [-errtags[=a]] [-errwarn[=t[,t...]]] [-fast] [-features=a[,a...]] [-filt[=filter[,filter...]] [-flags] [-fma[={none|fused}]] [-fnonstd] [-fns[={yes|no}]] [-fopenmp] [-fprecision=a] [-fround=a] [-fsimple[=n]] [-fstore] [-ftrap=a[,a...]] [-G] [-g] [-g[n]] [-H] [-h[ ]lname] [-help] [-Ipathname] [-I-] [-i] [-include] [-inline] [-instances=i] [-instlib=file] [-KPIC] [-Kpic] [-keeptmp] [-Lpath] [-llib] [-libmieee] [-libmil] [-library=lib[,lib...]] [-m32|-m64] [-mc] [-misalign] [-mr[,string]] [-mt] [-native] [-noex] [-nofstore] [-nolib] [-nolibmil] [-noqueue] [-norunpath] [-O[n]] [-O[level]] [-o file] [+p] [-P] [-p] [-pentium] [-pg] [-PIC] [-pic] [-preserve_argvalues[=int|none]] [-pta] [-ptipath] [-pto] [-ptv] [{-Qoption|-qoption} phase [,option...]] [{-Qproduce|-qproduce}type] [-qp] [-Rpath[:path...]] [-S] [-s] [-staticlib=l[,l...]] [-std=v] [-sync_stdio=[yes|no]] [-temp=path] [-template=a[,a...]] [-time] [-traceback[=list]] [-Uname] [-unroll=n] [-V] [-v] [-verbose=a[,a...]] [-Wc,arg] [+w] [+w2] [-w] [-Xlinker arg] [-Xm] [-xaddr32[={yes|no}]] [-xalias_level[=n]] [-xanalyze={code|no}] [-xannotate[={yes|no}]] [-xar] [-xarch=isa] [-xautopar] [-xbinopt={a}] [-xbuiltin[={a}] [-xcache=c] [-xchar[=o]] [-xcheck[=n]] [-xchip=c] [-xcode=v] [-xdebugformat=[stabs|dwarf]] [-xdebuginfo=a[,a...]] [-xdepend[={yes|no}]] [-xdumpmacros[=value[,value...]] [-xe] [-xF[=v]] [-xglobalize[={yes|no}]] [-xhelp=flags] [-xhwcprof[={enable|disable}]] [-xia] [-xinline[=func_spec[,func_spec...]] [-xinline_param=a[,a[,a]...]] [-xinline_report[=n]] [-xinstrument=[no%]datarace] [-xipo[={0|1|2}] [-xipo_archive[=a]] [-xipo_build=[yes|no]] [-xivdep[=p]] [-xjobs=[n|auto]] [-xkeep_unref[={[no%]funcs,[no%]vars}]] [-xkeepframe[=p]] [-xlang=language[,language]] [-xldscope=[v]] [-xlibmieee] [-xlibmil] [-xlibmopt] [-xlic_lib=sunperf] [-xlicinfo] [-xlinkopt[=level]] [-xloopinfo] [-xM] [-xM1] [-xMD] [-xMF] [-xMMD] [-xMerge] [-xmaxopt[=v]] [-xmemalign=ab] [-xmodel=[a]] [-xnolib] [-xnolibmil] [-xnolibmopt] [-xOn] [-xopenmp[=i]] [-xpagesize=n] [-xpagesize_heap=n] [-xpagesize_stack=n] [-xpatchpadding[={fix|patch|size}]] [-xpch=v] [-xpchstop] [-xpec] [-xpg] [-xport64[=v]] [-xprefetch[=a[,a]] [-xprefetch_auto_type=[a] [-xprefetch_level[=l]] [-xprevise={yes|no}] [-xprofile=p] [-xprofile_ircache[=path]] [-xprofile_pathmap=collect_prefix:use_prefix] [-xreduction] [-xregs=r[,r...]] [-xrestrict[=f]] [-xs[={yes|no}]] [-xsafe=mem] [-xsegment_align=n] [-xspace] [-xtarget=t] [-xtemp=path] [-xthreadvar[=o]] [-xthroughput[={yes|no}]] [-xtime] [-xtrigraphs[={yes|no}]] [-xunboundsym={yes|no}] [-xunroll=n] [-xustr={ascii_utf16_ushort|no}] [-xvector[=a]] [-xvis] [-xvpara] [-xwe] [-Yc,path] [-z arg] [file] ...
Oracle Solaris Studio 12.4 C++ 编译器。
本手册页详细介绍了 Oracle Solaris Studio 12.4 C++ 编译器的选项或标志。
Oracle 技术网 (Oracle Technical Network, OTN) Solaris Studio Web 站点上提供了本发行版的完整文档:
http://oracle.com/technetwork/server-storage/solarisstudio
OTN Web 站点提供了有关 Oracle Solaris Studio 的完整资源,包括许多技术文章,这些文章详细介绍了最佳实践,并深入探究了各种编程技术和其他主题。
有关 Oracle Solaris Studio 套件中所有新增特性和功能的完整描述,请参见本发行版新增功能指南。
根据定义,手册页是指快速参考。有关 C++ 编译器及其选项的更多详细信息,请参见 C++ 用户指南。
分别使用 -m32 和 -m64 选项指定目标编译的内存模型 ILP32 或 LP64。
-xarch 选项不再承载隐式内存模型定义,只能用于指定目标处理器的指令集。
ILP32 模型指定 C 语言 int、long 和 pointer 数据类型均为 32 位。LP64 模型指定 long 和 pointer 数据类型均为 64 位。Oracle Solaris 和 Linux OS 还支持 LP64 内存模型下的大型文件和大型数组。
如果使用 -m64 进行编译,则生成的可执行文件仅能在运行 64 位内核的 Oracle Solaris OS 或 Linux OS 下的 64 位 SPARC 或 x86 处理器上运行。64 位对象的编译、链接和执行只能在支持 64 位执行的 Oracle Solaris 或 Linux OS 上进行。
针对 x86 Oracle Solaris 平台进行编译时,要注意一些重要问题。
在 -xarch 设置为 sse、sse2、sse2a 或 sse3 以及更高级别的情况下编译的程序必须仅在提供这些扩展和功能的平台上运行。
在本发行版中,-xarch=generic 的缺省指令集和含义已更改为 sse2。现在,如果在不指定目标平台选项的情况下进行编译,会导致 sse2 二进制与早期的 Pentium III 或早期的系统不兼容。
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
-xarch=pentium_pro 或 -xarch=sse 的数值结果可能与在 SPARC 上得到的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用缺省 -xarch=sse2 进行编译。
因为内部数学库(例如,sin(x))不同,所以 Oracle Solaris 和 Linux 之间的数值结果也会不同。
使用专门的 -xarch 硬件标志编译和生成的程序二进制文件经验证可在适当的平台上运行。如果在没有相应功能或指令集扩展的平台上运行使用专门的 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
但是,在 Linux 上,没有此类验证检查。在早期的硬件平台上运行由 Oracle Solaris Studio 编译器编译的二进制对象会导致运行时故障;在 Linux 上,用户负责在适当的硬件平台上部署这些二进制文件。
如果程序中采用的 .il 内联汇编语言函数或 __asm() 汇编程序代码使用了 SSE、SSE2、SSE2a、SSE3 以及更高版本的指令和扩展,则此警告也适用于这类程序。
CC 会将 C++ 和汇编源文件转换为对象文件,并将对象文件和库链接为可执行程序。
包含 C++ 对象的程序必须使用 CC 链接。
CC 将以 .c、.C、.cc、.cxx、.c++、.cpp 或 .i 结尾的参数视为 C++ 源程序。以 .s 结尾的参数则假定为汇编源文件。以 .o 结尾的参数则假定为对象文件。
名称不以上述后缀结束的文件将视为对象程序或库,并移交给链接编辑器。除非指定 -c、-S、-E 或 -P,否则将按给定顺序将这些程序和库与任何指定编译或汇编的结果链接在一起,以生成名为 a.out 的输出文件。您可以使用 -o 选项为该可执行文件指定其他名称。
如果同时编译和链接一个文件,则会删除中间文件。
在您使用 CC 命令之前,请在您的搜索路径中插入您选择用来安装 C++ 编译系统的目录的名称。有关设置搜索路径的说明,请参见 csh(1) 或 sh(1) 手册页。
通过缺省编译器选项文件,用户可以指定一组应用于所有编译的缺省选项,除非另行覆盖。例如,该文件可以指定所有编译的缺省级别为 -xO2,或自动包括文件 setup.il。
启动时,编译器会搜索缺省选项文件,并列出应对所有编译包含的缺省选项。环境变量 SPRO_DEFAULTS_PATH 指定要在其中搜索缺省文件的目录的冒号分隔列表。
如果该环境变量未设置,则会使用一组标准缺省设置。如果该环境变量已设置但为空,则不会使用任何缺省设置。
缺省文件名的格式必须为 compiler.defaults,其中 compiler 是以下项之一:cc、c89、c99、CC、ftn 或 lint。例如,C++ 编译器的缺省值为 CC.defaults。
如果在 SPRO_DEFAULTS_PATH 列出的目录中找到了适用于编译器的缺省文件,则编译器将读取该文件,并在处理命令行上的选项之前处理这些选项。系统将使用找到的第一个缺省文件,并且会终止搜索。
系统管理员可能会在 Studio-install-path/prod/etc/config 中创建适用于整个系统范围的缺省文件。如果设置了该环境变量,则不会读取已安装的缺省文件。
缺省文件的格式与命令行类似。该文件的每一行都可以包含一个或多个由空格分隔的编译器选项。Shell 扩展(例如通配符和替换)将不会应用于缺省文件中的选项。
SPRO_DEFAULTS_PATH 的值和完全扩展的命令行将显示在由选项 -#、- 和 -dryrun 生成的详细输出中。
用户在命令行上指定的选项通常会优先于从缺省文件读取的选项。例如,如果缺省文件指定使用 -xO4 进行编译,而用户在命令行上指定了 -xO2,则将使用 -xO2 进行编译。
缺省选项文件中显示的某些选项将附加在命令行中指定的选项之后。这些选项包括预处理程序选项 -I,链接程序选项 -B、-L、-R 和 -l,以及所有文件参数(例如:源文件、对象文件、归档文件和共享对象)。
以下是如何使用用户提供的缺省编译器选项启动文件的示例。
demo% cat /project/defaults/CC.defaults -fast -I/project/src/hdrs -L/project/libs -llibproj -xvpara demo% setenv SPRO_DEFAULTS_PATH /project/defaults demo% CC -c -I/local/hdrs -L/local/libs -lliblocal tst.cc
编译器命令现在等效于:
CC -fast -xvpara -c -I/local/hdrs -L/local/libs -lliblocal tst.cc -I/project/src/hdrs -L/project/libs -llibproj
尽管编译器缺省文件提供了可为整个项目设置缺省值的便利方法,但它也可能成为问题难以诊断的原因。将环境变量SPRO_DEFAULTS_PATH设置为当前目录以外的绝对路径可避免出现此类问题。
缺省选项文件的接口稳定性未确定。选项处理顺序在以后的发行版中可能会更改。
在所有平台上都无提示接受所有特定于平台的选项。这项规则的任何例外都在特定选项下注明。
只在 SPARC 平台上有效的选项标记为 (SPARC)。只在 x86/x64 平台上有效的选项标记为 (x86)。
过时的选项标记为(Obsolete)(已过时),以后不应再使用。提供它们只是为了与早期发行版兼容。请使用指定的替代选项。
有关链接程序选项,请参见 ld(1)。
在命令行选项语法中,方括号 ([]) 中显示的项目是可选的。花括号括起要选择的文字项目的竖线分隔列表,如 {yes | no | maybe} 中所示。当显示的标志不带值时,列表中的第一项通常表示缺省值。
例如,-someoption[={no|yes}] 意味着 -someoption 与 -someoption=no 相同。
通常,编译器选项的处理顺序是从左到右(只有 -U 选项在处理完所有 -D 选项之后处理),从而允许有选择地覆盖宏选项(包含其他选项的选项)。此规则不适用于链接程序选项。
有关 C++ 编译器选项的完整介绍,请参见 C++ 用户指南。
CC 接受以下选项。
- -#
-
打开详细模式,显示如何扩展命令选项。显示调用的每个组件。
- -
-
好像要进行调用一样显示每个组件,但不实际执行该组件。还显示命令选项扩展的过程。
- -B binding
-
指定链接的库绑定是 symbolic、dynamic(共享)还是 static(非共享)。
-Bdynamic 为缺省值。可以在命令行上多次使用 -B 选项。
有关 -Bbinding 选项的更多信息,请参见 ld(1) 手册页以及 Oracle Solaris 文档。
-Bdynamic 指示链接编辑器查找 liblib.so 文件。当链接需要共享库绑定时,请使用该选项。如果找不到 liblib.so 文件,则会查找 liblib.a 文件。
-Bstatic 指示链接编辑器仅查找 liblib.a 文件。.a 后缀表明该文件是静态的(即,非共享文件)。当链接需要非共享库绑定时,请使用该选项。
-Bsymbolic 强制在共享库中解析符号(如果可能),即使符号已经在别处定义也不例外。有关 -Bsymbolic 的说明,请参见 ld(1) 手册页。
此选项及其参数传递给链接程序 ld。如果在不同的步骤中进行编译和链接,并要使用 -Bbinding 选项,就必须在链接步骤中包括该选项。
警告:
对于包含 C++ 代码的程序,切勿使用 -Bsymbolic,而应使用链接程序作用域。有关链接程序作用域的更多信息,请参见 C++ 用户指南。另请参见 -xldscope 选项。
如果使用 -Bsymbolic,不同模块中的引用会绑定到应是一个全局对象内容的不同副本。
异常机制依赖对地址的比较。如果您具有某项内容的两个副本,它们的地址就不等同且异常机制可能失败,这是由于异常机制依赖对假设为唯一地址内容的比较。
- -c
-
针对未链接的每个源文件编译并生成 .o 文件。您可使用 -o 选项显式指定单个对象文件。当编译器生成每个 .i 或 .c 输入文件的对象代码时,始终会在当前工作目录中创建一个对象文件。如果抑制链接步骤,将会同时抑制删除对象文件。
例如:
- CC -c x.cc 会生成对象文件 x.o。
- CC -c -o y.o x.cc 会生成对象文件 y.o。
警告:
当编译器为输入文件(例如,.cc、.c 或 .i)生成对象代码时,编译器总是在工作目录下生成 .o 文件。如果抑制链接步骤,则不会删除 .o 文件。
另请参见:-o filename
- -compat={ 5| g}
-
设置编译器的兼容模式。-compat 选项必须指定模式,可以为 5,也可以为 g。首选使用新的 -std 选项,它可以提供更多的选择。
-compat=5 模式实现 ANSI/ISO 1998 C++ 标准(在 2003 年修正)描述的语言,并且是 Oracle Solaris Studio 12.4 发行版的缺省模式。(在 Oracle Solaris Studio 12.3 中删除了“兼容型模式”-compat=4。)
在所有 Oracle Solaris 和 Linux 平台上,-compat=g 模式采用相同的标准并提供与 gcc/g++ 编译器的兼容性。
- -compat=5
-
选择 C++03 版本,以使用 Sun ABI 并与 C++ 5.0 到 5.12 兼容。将 __SUNPRO_CC_COMPAT 预处理程序宏设置为 5。与 -std=sun03 等效。
- -compat=g
-
启用对某些 g++ 语言扩展的识别,并使编译器在 Oracle Solaris 和 Linux 平台上生成与 g++ 二进制兼容的代码。与 -std=c++03 等效。
使用的 gcc 头文件和库是编译器(而不是系统上安装的 gcc 版本)随附的那些头文件和库。
二进制兼容性仅扩展到共享(动态或 .so)库,未扩展到单独的 .o 文件或归档文件 (.a) 库。
将 __SUNPRO_CC_COMPAT 预处理程序宏设置为 'G'。
示例 1:将 g++ 共享库链接到 Oracle Solaris Studio C++ 主程序
% g++ -shared -o libfoo.so -fpic a.cc b.cc c.cc % CC -compat=g main.cc -L. -lfoo
示例 2:将 Oracle Solaris Studio C++ 共享库链接到 g++ 主程序
% CC -compat=g -G -o libfoo.so -Kpic a.cc b.cc c.cc % g++ main.cc -L. -lfoo
缺省值:
如果 -compat 和 -std 选项都未指定,则假定 -compat=5。
交互:
-compat 和 -std 选项不能显示在同一个命令行上。
有关更多信息,请参见 -features。
- +d
-
阻止编译器扩展 C++ 内联函数。
按照 C++ 语言规则,C++ 内联函数是指具有以下特征的函数:对于该函数以下陈述之一为真。
- 该函数的定义中使用了 inline 关键字。
- 该函数在类定义内部定义(不仅是声明)。
- 该函数是编译器生成的类成员函数。
按照 C++ 语言规则,编译器可以选择是否将调用实际内联到内联函数。C++ 编译器将调用内联到内联函数,除非:
- 函数太复杂。
- 已选定 +d 选项。
- 已选择 -g 选项且未选择优化选项。
交互:
指定了调试选项 -g 时将自动启用此选项,除非还指定了 -O 或 -xO 优化级别。
但指定调试选项 -g0 不会启用 +d。
+d 选项对使用 -xO4 或 -xO5 时执行的自动内联没有影响。
- -D name[ = def]
-
为预处理程序定义宏符号 name。使用该选项与在源文件开头包含 #define 指令等效。可以使用多个 -D 选项。
以下值是预定义的。
SPARC 和 x86 平台:
__ARRAYNEW __BUILTIN_VA_ARG_INCR __DATE__ __FILE__ __LINE__ __STDC__ = 0 __SUNPRO_CC = 0x5130 __SUNPRO_CC_COMPAT = 5 or G __TIME__ __cplusplus __has_attribute __sun __unix _BOOL if type bool is enabled (see "-features=[no%]bool") _WCHAR_T sun unix __SVR4 (Oracle Solaris) __SunOS_5_10 (Oracle Solaris) __SunOS_5_11 (Oracle Solaris)
注意:__has_attribute 是函数式宏。
仅适用于 SPARC:
sparc sparcv8 __SUN_PREFETCH = 1 __sparc
仅适用于 SPARC V9:
__sparcv9 (with -m64)
仅适用于 x86:
linux __amd64 (with -m64) __gnu__linux__ __linux __linux__ __x86_64 (with -m64)
请注意,仅在 Oracle Solaris 平台上定义了 __sun。可使用 __SUNPRO_CC 确定编译器是否为 Oracle Solaris Studio CC 编译器。
缺省值:
如果不使用 [=def],name 将定义为 1。
交互:
如果使用 +p,则不会定义 sun、unix、sparc 和 i386。
- -d{ y| n}
-
允许或不允许整个可执行文件的动态库。
-dy 指定动态链接,这是链接编辑器中的缺省值。
-dn 指定链接编辑器中的静态链接。
此选项及其参数将传递给 ld。
交互:
如果将此选项与动态库结合使用,将导致致命错误。大多数系统库仅作为动态库可用。
- -dalign
-
(SPARC)(已过时)您不应使用此选项。改用 -xmemalign=8s。有关已过时选项的完整列表,请参见 C++ 用户指南。
在 x86/x64 平台上会在无提示的情况下忽略此选项。
- -dryrun
-
指示 CC 驱动程序显示但不执行编译驱动程序构造的命令。
- -E
-
指示 CC 驱动程序仅预处理 C++ 源文件,并将结果发送到 stdout(标准输出)。此时,不进行编译,且不生成 .o 文件。
此选项会导致输出中包含预处理程序类型的行号信息。
要在源代码涉及模板时编译 -E 选项的输出,可能需要将 -template=no%extdef 选项与 -E 选项一起使用。如果应用程序代码使用“独立定义”模板源代码模型,使用这两个选项可能仍然无法编译 -E 选项的输出。有关更多信息,请参阅 C++ 用户指南中有关模板的章节。
- -erroff[ = t[, t...] ]
-
禁止编译器警告消息,但是对错误消息无影响。此选项适用于所有警告消息,无论这些警告消息是否已被 -errwarn 指定为导致非零退出状态。
值:
-erroff 值是逗号分隔列表的成员,该列表包含以下项中的一个或多个:
- tag
-
抑制由该 tag 指定的警告消息。可通过 -errtags=yes 选项来显示消息的标记。
- no% tag
-
启用由该 tag 指定的警告消息。
- %all
-
禁止所有警告消息。
- %none
-
启用所有警告消息。这是缺省值。
顺序是很重要的;例如 %all,no%tag 抑制除 tag 以外的所有警告消息。
缺省值:
缺省值为 -erroff=%none。指定 -erroff 与指定 -erroff=%all 等效。
警告:
使用 -erroff 选项只能抑制来自 C++ 编译器前端且在使用 -errtags 选项时显示标记的警告消息。
- -errtags [ = a]
-
显示来自 C++ 编译器前端且可以使用 -erroff 选项抑制或使用 -errwarn 选项使其成为致命错误的每个警告消息的消息标记。来自 C++ 编译器驱动程序以及 C++ 编译系统其他组件的消息不带错误标记,使用 -erroff 选项并不能抑制这些消息,而使用 -errwarn 选项也不会产生致命错误。
值和缺省值:
a 可以是 yes 或 no。缺省值是 -errtags=no。指定 -errtags 等效于指定 -errtags=yes。
在前面的 C++ 编译器中,-errtags 选项导致在警告和错误消息中输出一个标记。C++ 编译器的行为现在和 C 编辑器一样,但仅针对警告消息显示标记。
- -errwarn [ = t[, t...]]
-
使用 -errwarn 选项会导致 C++ 编译器在出现给定的警告消息时以失败状态退出。
值:
t 是一个以逗号分隔的列表,它包含以下项中的一项或多项:tag、no% tag、%all、%none。顺序很重要;例如,如果发出除标记之外的任何警告,%all,no%tag 会使 C++ 编译器以致命状态退出。
下表详细列出了-errwarn 值:
- tag
-
在 tag 指定的消息作为警告消息发出时使 CC 以致命状态退出。如果未出现 tag,则没有影响。
- no% tag
-
防止 CC 在由 tag 指定的消息只以警告消息形式出现时以致命状态退出。如果未出现 tag,则没有影响。为了避免在发出警告消息时导致 CC 以致命状态退出,可使用该选项来还原以前用该选项和 tag 或 %all 指定的警告消息。
- %all
-
如果发出了任何警告消息,将导致 CC 以致命状态退出。%all 可以后跟 no% tag,以避免该行为的特定警告消息。
- %none
-
防止 CC 在出现任何警告标记时以致命状态退出。这是缺省值。
缺省值:
缺省值为 -errwarn=%none。如果单独指定 -errwarn,与 -errwarn=%all 等效。
警告:
由于编译器错误检查的改善和功能的增加,C++ 编译器生成的警告消息也会因发行版本而异。使用 -errwarn=%all 进行编译而不会产生错误的代码,在编译器下一个发行版本中编译时也可能出现错误。
只有来自 C++ 编译器前端在使用 -errtags 选项时会显示标记的警告消息可以使用 -errwarn 选项进行指定,从而使 C++ 编译器以失败状态退出。
另请参见:-erroff、-errtags
- -fast
-
该选项是一个宏,您可以有效地将其用作调优可执行文件以获得最高运行时性能的起点。-fast 的扩展可从一个编译器发行版更改为下一个发行版,并且包括特定于目标平台的选项。可使用 -dryrun 选项检查 -fast 的扩展,并将 -fast 的相应选项结合到正在进行的可执行文件调优过程中。
用 -fast 编译的模块必须也用 -fast 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C++ 用户指南。
-fast 的扩展选项包括 -xlibmopt 选项,该选项使编译器可使用优化的数学例程库。有关更多信息,请参见本手册页中 -xlibmopt 的描述。
该选项通过扩展以下编译选项,为大多数应用程序提供了几乎最高的性能:
-fma=fused (SPARC, x86) -fns (SPARC, x86) -fsimple=2 (SPARC, x86) -nofstore (x86) -xbuiltin=%all (SPARC, x86) -xdepend (SPARC, x86) -xlibmil (SPARC, x86) -xlibmopt (SPARC, x86) -xmemalign (SPARC) -xO5 (SPARC, x86) -xregs=frameptr (x86) -xtarget=native (SPARC, x86)
请注意,这些组件选项标志会随各个编译器发行版而发生变化。可以运行以下命令来查看 -fast 选项的扩展
CC -fast -xdryrun |& grep
有关由 -fast 设置的选项的详细信息,请参见 C++ 用户指南。
交互:
可以在命令行中的 -fast 右侧指定不同的值来覆盖由 -fast 设置的值。例如,虽然 -fast 设置的优化级别为 -xO5,但是如果您指定 -fast, -xO3,则优化级别将变为 -xO3。
-fast 宏可扩展为可能影响其他指定选项的编译选项。例如,在以下命令中,-fast 宏的扩展包括了将 -xarch 还原为某个 32 位体系结构选项的 -xtarget=native。
不正确:
example% CC -xarch=sparcvis3 -fast test.cc
正确:
example% CC -fast -xarch=sparcvis3 test.cc
查看每个选项的描述以确定可能的交互操作。
警告:
使用 -fast 选项编译的代码不可移植。例如,在 UltraSPARC(TM) III 系统上使用以下命令编译代码将生成一个在 UltraSPARC II 系统上不会执行的二进制文件。
example% CC -fast test.cc
请勿对依赖于 IEEE 标准浮点异常处理的程序使用此选项,否则会出现不同的数值结果、程序提前终止或意外的 SIGFPE 信号。
-fast 选项包括 -fns -ftrap=%none,即该选项禁用所有陷阱操作。
x86 上的 -fast 选项包括 -xregs=frameptr。请确保阅读 -xregs=frameptr 的介绍,特别是编译混合 C、Fortran 和 C++ 源代码时。
-fast 选项的扩展包括了 -D_MATHERR_ERRNO_DONTCARE。
另请参见:
数值计算指南、 ieee_sun (3M)
- -features= a
-
启用/禁用各种 C++ 语言特性。
下表列出了 -features 子选项关键字及其含义。应用于某子选项的前缀 no% 会禁用该子选项。
- %all
-
已过时。不使用 %all。请参见下面的警告。
- %none
-
已过时。不使用 %none。请参见下面的警告。
- [ no%] altspell
-
识别替用的标记拼写(例如,and 代替 &&)。缺省值为 altspell。
- [ no%] anachronisms
-
允许过时构造。禁用时(即 -feature=no%anachronisms),不允许使用任何过时构造。缺省值为 anachronisms。
- [ no%] bool
-
允许布尔型和文字。启用时,宏 _BOOL = 1。禁用时,不会定义宏。缺省值为 bool。
- [ no%] conststrings
-
将文字字符串放在只读内存中。缺省值为 conststrings。
- cplusplus_redef
-
允许在命令行中通过 -D 选项重新定义以常规方式预定义的宏 __cplusplus。不允许在源代码中使用 #define 指令重新定义 __cplusplus。
示例:
CC -features=cplusplus_redef -D__cplusplus=1 ...
g++ 编译器通常将 __cplusplus 宏预定义为 1,而源代码可能依赖于此非标准值。(对于实现了 1998 C++ 标准或 2003 更新的编译器,标准值是 L。对于该宏,将来的标准要求采用更大的值。)
除非您需要将 __cplusplus 重新定义为 1 以编译打算供 g++ 使用的代码,否则不要使用此选项。
- [ no%] except
-
允许 C++ 异常。C++ 异常处于禁用状态时(即 -features=no%except),接受但忽略函数的抛出规范,编译器不生成异常代码。请注意,关键字 try、throw 和 catch 始终保留。缺省值为 except。
- explicit
-
识别关键字 explicit。不允许 no%explicit。
- [ no%] export
-
识别关键字 export。缺省值为 export。
- [ no%] extensions
-
允许其他 C++ 编译器通常接受的非标准代码。有关使用 -features=extensions 选项时编译器接受的无效代码的说明,请参见 C++ 用户指南中的第 4 章。缺省值为 -features=no%extensions。
- [ no%] iddollar
-
允许使用 $ 作为非首位标识符字符。缺省值为 no%iddollar。
- [ no%] localfor
-
针对 for 语句使用符合标准的本地范围规则。缺省值为 localfor。
- [ no%] mutable
-
识别关键字 mutable。缺省值为 mutable。
- namespace
-
识别关键字 namespace。不允许 no%namespace。
- [ no%] nestedaccess
-
允许嵌套类访问包容类的专用成员。缺省值为 -features=nestedacces。
- [ no%] rvalueref
-
允许将非 const 引用绑定到 rvalue 或 temporary。缺省值为 -features=no%rvalueref。在强制非 const 引用不能绑定到 temporary 或 rvalue 的规则方面,C++ 编译器过去一直比较宽松。缺省情况下,C++ 编译器会接受无效代码。要恢复旧编译器的行为,请使用 -features=rvalueref 选项。
- [ no%] rtti
-
允许运行时类型标识 (runtime type identification, RTTI)。
- [ no%] split_init
-
将非局部静态对象的初始化程序放到各个函数中。使用 -features=no%split_init 时,编译器将所有初始化函数放入一个函数中。使用 -features=no%split_init 可最大限度减小代码大小,但编译时间可能增加。缺省值为 split_init。
- [ no%] strictdestorder
-
遵循由 C++ 标准指定的、对具有静态存储持续时间的对象的析构顺序要求。缺省值为 strictdestrorder。
- [ no%] tmplife
-
按照 ANSI/ISO C++ 标准的定义,清除由表达式在完整表达式结尾创建的临时对象。(-features=no%tmplife 生效时,多数临时对象会在其块终结时清除。)缺省值为 tmplife。
- [ no%] tmplrefstatic
-
允许函数模板引用相关静态函数或静态函数模板。缺省值是遵循标准的 no%tmplrefstatic。
- [ no%] transitions
-
允许如下 ARM 语言构造:在标准 C++ 中有问题,且可能导致程序的行为不像预期或可能被将来的编译器拒绝。使用 -features=no%transitions 时,编译器会发出关于这些构造的警告,而不是错误消息。
交互:
该选项会累积而不覆盖。
以下选项与标准库和头文件不兼容:
- no%bool
- no%except
- no%mutable
警告:
不要使用 -features=%all 或 -features=%none。这些子选项已过时并且在以后的发行版中可能会被删除。结果可能不可预测。
使用 -features=tmplife 时,程序的行为可能会发生变化。测试在使用与不使用 -features=tmplife 选项两种情况下程序是否正常运行是一种测试程序可移植性的方法。
- -filt[ = filter[, filter...]]
-
禁止 CC 通常应用于链接程序错误消息的过滤。
应用于某子选项的前缀 no% 会禁用该子选项。
filter 必须为以下值之一:
- [ no%] errors
-
显示链接程序错误消息的 C++ 解释。链接程序的诊断信息被直接提供到其他工具时,可以禁止这种解释。
- [ no%] names
-
取消改编的 C++ 链接程序名称。
- [ no%] returns
-
取消改编函数的返回类型。禁止这种取消改编可帮助您更快地识别函数名称,但请注意,联合变体返回的部分函数只在返回类型上有区别。
- [ no%] stdlib
-
在链接程序和编译器错误消息中简化来自标准库的名称。这样更便于您识别标准库函数的名称。
- %all
-
等效于 -filt=errors,names,returns,stdlib。这是缺省行为。
- %none
-
等效于 -filt=no%errors,no%names,no%returns,no%stdlib。
缺省值:
如果未指定 -filt 选项或指定了 -filt 但未提供任何值,则编译器假定 -filt=errors,names,returns,stdlib。
交互:
与 no%names 一起使用时,[no%]returns 没有作用。即,以下选项等效:
-filt=no%names -filt=no%names,no%returns -filt=no%names,returns
另请参见: c++filt (1) 。
- -flags
-
与 -xhelp=flags 相同。
- -fma[ ={ none| fused}]
-
启用自动生成浮点混合乘加指令。-fma=none 禁用这些指令的生成。-fma=fused 允许编译器通过使用浮点混合乘加指令,尝试寻找改进代码性能的机会。
缺省值为 -fma=none。
要生成混合乘加指令,最低体系结构要求是 -xarch=sparcfmaf(对于 SPARC)和 -xarch=avx2(对于 x86)。如果生成了混合乘加指令,编译器会标记此二进制程序,以防止该程序在不支持混合乘加指令的平台上执行。如果未使用最低体系结构,则 -fma=fused 不起作用。
混合乘加指令可以免除乘法和加法之间的中间舍入步骤。因此,如果使用 -fma=fused 编译,程序可能会生成不同的结果,但精度通常会增加而不是降低。
- -fnonstd
-
这是可扩展至 -ftrap=common(在 x86 上)和 -fns -ftrap=common(在 SPARC 上)的宏。
有关更多信息,请参见 -fns、-ftrap=common 和数值计算指南。
- -fns[ ={ no| yes}]
-
对于 SPARC,此选项会导致在程序开始执行时启用非标准浮点模式。
对于 x86,此选项选择 SSE 刷新为零模式,以及非正规数为零模式(如果可用)。此选项导致在 x86 上将次正规结果刷新为零。如果可用的话,此选项还导致将次正规操作数视为零。此选项对不使用 SSE 或 SSE2 指令集的传统 x86 浮点运算没有影响。
在某些 SPARC 平台上,非标准浮点模式会禁用“逐渐下溢”,这会导致很小的结果刷新为零而不是生成次正规数。此外,还会导致次正规操作数在无提示的情况下替换为零。
在那些不支持硬件中的渐进下溢和次正规数的 SPARC 平台上,使用此选项将显著提高某些程序的性能。
可以选择使用 =yes 或 =no,此方法使您可以切换包含 -fns 的其他某个宏标志(如 -fast)后面的 -fns 标志。
-fns 与 -fns=yes 相同。-fns=yes 选择非标准浮点。-fns=no 选择标准浮点。
缺省值:
如果未指定 -fns,则不自动启用非标准浮点模式。进行标准 IEEE 754 浮点计算(即逐渐下溢)。
如果仅指定了 -fns,则假定 -fns=yes。
警告:
在启用了非标准模式的情况下,浮点运算可能会产生不符合 IEEE 754 标准要求的结果。
在 SPARC 系统上,只有编译主程序时此选项才有效。
如果使用 -fns 编译一个例程,应使用 -fns 选项编译该程序的所有例程;否则,可能会出现意外结果。
- -fopenmp
-
与 -xopenmp=parallel 相同。
- -fprecision= a
-
(x86) 设置浮点舍入精度模式。a 必须是以下值之一:single、double、extended。
-fprecision 标志用于设置浮点控制字中的舍入精度模式位。这些位控制基本算术运算(加、减、乘、除和平方根)结果的舍入精度。
下表显示 a 值的含义。
- single
-
舍入到 IEEE 单精度值
- double
-
舍入到 IEEE 双精度值
- extended
-
舍入到最大可用精度
如果 a 为 single 或 double,则该标志会使舍入精度模式在程序开始执行时分别设置为 single 或 double 精度。如果 p 是 extended 或未使用 -fprecision 标志,则舍入精度模式保持为 extended 精度。
在 single 精度舍入模式下,结果将舍入到 24 个有效位;在 double 精度舍入模式下,结果将舍入到 53 个有效位。在缺省的 extended 精度模式下,结果将舍入到 64 个有效位。该模式只控制在寄存器中结果的舍入精度,而不影响范围。寄存器中所有的结果都使用了各种已扩展的双精度格式来舍入。存储在内存中的结果既舍入到目标格式的范围也舍入到目标格式的精度。
float 类型的标称精度为 single。long double 类型的标称精度为 extended。
缺省值:
如果未指定 -fprecision 标志,则舍入精度模式缺省为 extended。
警告:
该选项仅在 x86 系统上且仅在编译主程序时使用才有效,但如果针对 64 位平台 (-m64) 或启用 SSE2 的处理器 (-xarch=sse2) 进行编译,将忽略该选项。在 SPARC 平台上忽略 -fprecision。
- -fround= a
-
启动时设置有效的 IEEE 舍入模式。
a 必须是以下值之一:nearest、tozero、negative、positive。
- nearest
-
舍入到最接近的数字并转变为偶数。
- tozero
-
舍入为零。
- negative
-
舍入到负无穷大。
- positive
-
舍入到正无穷大。
该选项将 IEEE 754 舍入模式设置为:
- 可以由编译器在对常量表达式求值时使用。
- 是在程序初始化过程中在运行时建立的。
含义与 ieee_flags 函数的含义相同,可用于更改运行时的模式。
缺省值:
如果未指定 -fround 选项,舍入模式缺省为 -fround=nearest.
警告:
如果使用-fround=a 编译一个例程,就要使用相同的 -fround=a 选项编译程序的所有例程;否则,会得到意外结果。只有编译主程序时该选项才有效。
请注意,使用 -xvector 或 -xlibmopt 进行编译时需要具有缺省的舍入模式。与使用 -xvector 或 -xlibmopt(或同时使用两者)编译的库链接的程序必须确保缺省舍入生效。
- -fsimple[ = n]
-
选择浮点优化首选项。
如果存在 n,它必须是 0、1 或 2。
下表显示了 -fsimple 值。
- 0
-
允许无简化假定。保持严格的 IEEE 754 符合性。
- 1
-
允许保守简化。结果代码未严格符合 IEEE 754。
在 -fsimple=1 的情况下,不允许优化器不考虑舍入或异常进行完全优化。特别是,在运行时舍入模式包含常量的情况下,浮点计算不能由产生不同结果的计算替换。
在 -fsimple=1 的情况下,优化器可假定:
- 在进程初始化之后,IEEE 754 缺省舍入/捕获模式不发生改变。
- 除产生潜在浮点异常的计算不能删除外,产生不可视结果的计算都可以删除。
- 使用无穷大或 NaN 作为操作数的计算不需要将 NaN 传送到它们的结果中。例如,x*0 可以用 0 替换。
- 计算不依赖于零的符号。
- 2
-
包含 -fsimple=1 的所有功能,当 -xvector=simd 生效时,还允许使用 SIMD 指令计算约简。
此外,还允许主动浮点优化,这可能导致很多程序因舍入更改而产生不同数值结果。例如,允许优化器将给定循环中的所有 x/y 计算替换为 x*z,其中,要保证在循环 z=1y 中至少对 x/y 求一次值,并且在执行该循环期间已知 y 和 z 的值为常量值。
缺省值:
如果未指定 -fsimple,编译器将使用 -fsimple=0。
如果指定了 -fsimple 但未指定 n 值,编译器将使用 -fsimple=1。
警告:
该选项可以破坏 IEEE 754 的一致性。
另请参见:
有关优化如何影响精度的更详细说明,请参见由 Rajat Garg 和 Ilya Sharapov 合著的《Techniques for Optimizing Applications: High Performance Computing》。另请参见 OTN Oracle Solaris Studio Web 站点 (oracle.com/technetwork/server-storage/solarisstudio/) 上有关性能和精度的文章
- -fstore
-
(x86) 强制浮点表达式的精度。
在将浮点表达式或函数赋值给一个变量或将该表达式转换为较短浮点类型时,此选项会导致编译器将该表达式或函数的值转换为赋值左侧的类型,而不是将该值保留在寄存器中。
要禁用此选项,请使用 -nofstore 选项。
警告:
由于误差和截断,结果可能会与寄存器值所生成的结果不同。
- -ftrap= a[, a...]
-
设置在启动时有效的 IEEE 捕获模式,但不安装 SIGFPE 处理程序。可以使用 ieee_handler(3M) 或 fex_set_handling(3M) 启用陷阱并同时安装 SIGFPE 处理程序。如果指定多个值,则按从左到右顺序处理列表。
a 必须为以下值之一。
- [ no%] division
-
在除以零时自陷。
- [ no%] inexact
-
在结果不精确时自陷。
- [ no%] invalid
-
在操作无效时自陷。
- [ no%] overflow
-
在溢出时自陷。
- [ no%] underflow
-
在下溢时自陷。
- %all
-
在所有以上内容中自陷。
- %none
-
不在以上任何内容中自陷。
- common
-
在无效、除以零和溢出时自陷。
请注意,[no%] 前缀仅用于修改 %all 或 common 值的含义,且必须与其中的一个值一起使用,如示例中所示。[no%] 前缀本身不会显式导致禁用特定的陷阱。
缺省值:
如果未指定 -ftrap,编译器将假定 -ftrap=%none。
示例:-ftrap=%all,no%inexact 表示设置除 inexact 以外的所有陷阱。
警告:
如果使用 -ftrap 编译一个例程,应使用同一 -ftrap 选项编译该程序的所有例程;否则,可能会出现意外结果。
使用 -ftrap=inexact 陷阱时一定要格外小心,因为只要浮点值不能精确表示,便会产生自陷。例如,以下语句可能会产生这种情况:
x = 1.0 / 3.0;
- -G
-
生成动态共享库而不是可执行文件;请参见 ld(1) 手册页和 C++ 用户指南。缺省情况下,在命令行上指定的所有源文件都是使用 -xcode=pic13 进行编译的。
在从包含模板且用 -instances=extern 选项编译的文件中生成共享库时,将自动从模板缓存中包含 .o 文件引用的任何模板实例。
如果要通过指定 -G 与其他必须在编译时和链接时指定的编译器选项来创建共享对象,请确保在编译时和与生成的共享对象链接时也指定这些选项。
创建共享对象时,针对 64 位 SPARC 体系结构编译的所有对象文件也必须使用某个显式 -xcode 值进行编译,如 -xcode 说明下所述。
如果未指定 -c,会将以下选项传递至 ld:-dy、-G 和 -R。
请勿使用 ld -G 生成共享库,而应使用 CC -G。CC 驱动程序会自动将 C++ 所需的多个选项传递给 ld。
使用 -G 选项时,编译器不将任何缺省 -l 选项传递到 ld 选项。如果您要使共享库具有对另一共享库的依赖性,就必须在命令行上传递必需的 -l 或 -library 选项。例如,如果要使共享库依赖于 libCrun,必须在命令行上传递 -lCrun 或 -library=Crun。
- -g
-
请参见 -g[n]。
- -g[ n]
-
指示编译器和链接程序准备文件或程序,以用于使用 dbx(1) 进行调试或用于性能 analyzer(1)。任务包括:
- 生成以对象文件和可执行文件(取决于 n)的符号表形式表示的详细信息。
- 生成某些“帮助程序函数”,调试器可以调用这些函数来实现其某些功能。
- 如果未指定优化级别,则会禁用函数的内联生成;也就是说,在未指定优化级别时,使用此选项意味着使用了 +d 选项。将 -g 结合 -O 或 -xO 级别不会禁用内联。
- 禁用优化的某些级别。
如果将此选项与 -xO[level](或其等效选项,如 -O)一起使用,将会获得有限的内联调试信息。有关更多信息,请参见 -xO 的条目。
如果指定 -gO 且优化级别为 -xO3 或更低,编译器会为近乎完全优化提供尽可能多的符号信息。尾部调用优化已禁用。
如果使用该选项且优化级别为 -xO4 或更高,编译器会为完全优化提供尽可能多的符号信息。
指定此选项时,除非还指定 -O 或 -xO,否则会自动指定 +d 选项。
要使用性能分析器的完整功能,请使用 -g 选项进行编译。虽然某些性能分析功能不需要使用 -g,但必须使用 -g 进行编译,以便查看注释的源代码、部分函数级别信息以及编译器注释消息。有关更多信息,请参见 analyzer(1) 手册页和性能分析器手册。
使用 -g 生成的注释消息描述编译器在编译程序时进行的优化和变换。使用 er_src(1) 命令来显示与源代码交叉的消息。
如果在不同的步骤中编译和链接程序,则在一个步骤中使用 -g 选项而在另一个步骤中不使用该选项不会影响程序的正确性,但会影响调试程序的能力。没有使用 -g(或 -g0)编译但使用 -g(或 -g0)链接的任何模块将不能正常进行调试。请注意,要进行调试,通常需要使用 -g 选项(或 -g0 选项)对包含函数 main 的模块进行编译。
-g 作为宏实施,扩展到多个其他更原始的选项。有关扩展的详细信息,请参见 -xdebuginfo。
值:
- -g
-
生成标准调试信息。
- -gnone
-
不生成任何调试信息。这是缺省值。
- -g1
-
生成文件和行号以及在事后调试期间视为至关重要的简单参数信息。
- -g2
-
与 -g 相同。
- -g3
-
生成附加调试信息,当前只包括宏定义信息。与仅使用 -g 相比,此附加信息会增大生成的 .o 和可执行文件中调试信息的大小。
- -g0
-
指示编译器准备文件或程序以进行调试,但不禁用内联。此选项与 -g 相同,但 +d 处于禁用状态,dbx 无法步入内联函数。
另请参见:
有关更多信息,请参见 -xs 和 +d 的说明以及 ld(1) 手册页。
- -H
-
在标准错误输出 (stderr) 中,输出当前编译中包含的每个 #include 文件的路径名(每行一个)。
- -h[ ] lname
-
为生成的动态共享库指定名称 lname。
这是一个装入器选项,传递给 ld。通常,-h 后面的名称应该与 -o 后面的名称完全相同。-h 和 lname 之间的空格是可选的。
编译时的加载器将指定名称分配到正在创建的共享动态库中,并将该名称作为库的内部名称记录在库文件中。如果没有 -hlname 选项,则没有内部名称记录在库文件中。
每个可执行文件都具有所需的共享库文件列表。当运行时链接程序将库链接到可执行文件中时,链接程序将内部名称从库复制到所需共享库文件的列表中。如果没有共享文件的内部名称,链接程序就复制共享库文件的路径。以下命令行是一个示例:
% CC -G -o libx.so.1 -h libx.so.1 a.o b.o c.o
交互:
该选项会累积而不覆盖。
- -help
-
该选项已过时,在将来的发行版中将被删除。改用 -xhelp=flags。
- -I pathname
-
将 pathname 添加到在其中搜索具有相对文件名(不以斜杠开头的文件名)的文件的目录列表。
编译器按以下顺序搜索用引号括住的文件(形式为 #include "foo.h"):
- 在包含源代码的目录中
- 在使用 -I 选项指定的目录(如果有)中
- 在编译器提供的 C++ 头文件、ANSI C 头文件和专用文件的 include 目录中
- 在 usrinclude 中
编译器按以下顺序搜索用括号括住的文件(形式为 #include <foo.h>):
- 在使用 -I 选项指定的目录(如果有)中
- 在编译器提供的 C++ 头文件、ANSI C 头文件和专用文件的 include 目录中
- 在 usrinclude 中
如果此拼写与标准头文件的名称匹配,另请参阅 C++ 用户指南中的“标准头文件实现”。
交互:
该选项会累积而不覆盖。
-I- 选项允许您覆盖缺省的搜索规则。
如果指定了 -library=no%Cstd,则不会搜索编译器提供的 Cstd 头文件。
注意:如果未使用 -ptipath,则编译器将在 -Ipathname 中搜索模板文件。建议您使用 -Ipathname 而不是 -ptipath。
警告:
任何时候都不要将编译器安装区域 /usr/include、/lib、/usr/lib 指定为搜索目录。
- -I-
-
将包含文件搜索规则更改为:
- 对于 #include "foo.h" 形式的包含文件,按以下顺序搜索目录:
- 使用 -I 选项指定的目录(在 -I- 前后)。
- 编译器提供的 C++ 头文件、ANSI C 头文件和专用文件的目录。
- /usr/include 目录。
- 对于 #include <foo.h> 形式的包含文件,按以下顺序搜索目录:
- 使用 -I 选项指定的目录(在 -I- 后面)。
- 编译器提供的 C++ 头文件、ANSI C 头文件和专用文件的目录。
- /usr/include 目录。
警告:
任何时候都不要将编译器安装区域 /usr/include、/lib、/usr/lib 指定为搜索目录。
只有命令行上的第一个 -I- 会导致出现所述行为。
- 对于 #include "foo.h" 形式的包含文件,按以下顺序搜索目录:
- -i
-
指示链接程序 ld(1) 忽略任何 LD_LIBRARY_PATH 或 LD_LIBRARY_PATH_64 设置。
- -include filename
-
此选项使编译器处理 filename 的方式就相当于它是位于主源文件首行的 #include 预处理程序指令。
编译器在其中搜索 filename 的第一个目录是当前工作目录而不是包含主源文件的目录,这就是显式包括某个文件时的情况。如果编译器在当前工作目录中找不到 filename,则会在正常目录路径中搜索。如果您指定多个 -include 选项,则文件的包括顺序与它们在命令行中的顺序相同。
- -inline
-
该选项已过时,在将来的发行版中将被删除。改用 -xinline。
- -instances= a
-
控制模板实例的放置和链接。下表显示 a 值的含义。
- extern
-
将全部所需实例放置到 comdat 部分内的模板系统信息库并向其赋予全局链接。(如果系统信息库中的实例过期,就会被重新实例化。)
注意:如果在不同的步骤中进行编译和链接,并且在编译步骤中指定了 -instance=extern,则还必须在链接步骤中指定该选项。
- explicit
-
将显式实例化的实例放置到 comdat 部分内的当前对象文件并向其赋予全局链接。不生成其他任何所需实例。
- global
-
将所有所需的实例放置到 comdat 部分内的当前对象文件并向其赋予全局链接。
- semiexplicit
-
将显式实例化的实例和显式实例所需的全部实例放置到 comdat 部分的当前对象文件中并赋予全局链接。
- static
-
-instances=static 已过时。无需再使用 -instances=static,因为 -instances=global 现在提供了静态的所有优点而没有其缺点。以前编译器中提供的该选项用于克服此编译器版本中不存在的问题。将全部所需的实例放置到当前对象文件中并赋予静态链接。
缺省值:
如果未指定 instances,则假定 -instances=global。
警告:
static 和 semiexplicit 值可能会生成无效结果。有关更多信息,请参见 C++ 用户指南。
- -instlib= file
-
使用此选项可抑制生成在库(静态或共享)中重复的模板实例以及当前对象。一般来说,如果程序与库共享大量实例,可以尝试使用 -instlib=file,看看编译时间是否会减少。
值:
使用 file 参数指定包含可由当前编译生成的模板实例的库。文件名参数必须包含正斜杠 '/' 字符。对于相对于当前目录的路径,请使用点斜杠 'https://docs.oracle.com/cd/E57201_01/html/E57229/'。
缺省值:
-instlib=file 选项没有缺省值,只有在指定后才能使用。该选项可被多次指定和累积。
示例:
假定 libfoo.a 和 libbar.so 库可对与源文件 a.cc 共享的大量模板实例进行实例化。添加 -instlib=file 并指定库可通过避免冗余来减少编译时间。
example% CC -c -instlib=https://docs.oracle.com/cd/E57201_01/html/E57229/libfoo.a -instlib=https://docs.oracle.com/cd/E57201_01/html/E57229/libbar.so a.cc
交互:
使用 -g 进行编译时,如果使用 -instlib=file 指定的库没有使用 -g 编译,那么这些模板实例不可调试。解决方法是避免在使用 -g 时使用 -instlib=file。
不会搜索 -L 路径来查找 file。
警告:
如果使用 -instlib 指定库,就必须与该库链接。
另请参见:
-template、-instances、-pti
- -KPIC
-
(SPARC)(已过时)改用 -xcode=pic32。
(x86) 与 x86 体系结构上的 -Kpic 相同。
- -Kpic
-
(SPARC)(已过时)改用 -xcode=pic13。
(x86) 生成与位置无关的代码。生成共享库时使用该选项编译源文件。对全局数据的每个引用都生成为全局偏移表中指针的非关联化。每个函数调用都通过过程链接表在 pc 相对地址模式中生成。
- -keeptmp
-
保留在编译期间所创建的临时文件。该选项与 -verbose=diags 一起使用,对调试很有用。
- -L path
-
将 path 添加到库搜索目录。
该选项传递给 ld。链接程序会先搜索 path 指定的目录,然后再搜索编译器提供的目录。
交互:
该选项会累积而不覆盖。
警告:
任何时候都不要将 /usr/include、lib、/usr/lib 或编译器安装区域指定为搜索目录。
- -l lib
-
将库 liblib.a 或 liblib.so 添加到链接程序的搜索库列表。
该选项传递给 ld。库的名称通常为 liblib.a 或 liblib.so,其中 lib 和 .a 或 .so 部分是必需的。可以使用此选项指定 lib 部分。在一个命令行上放置任意数量的库;将按 -Lpath 指定的顺序搜索这些库。
请在对象文件名之后使用该选项。
交互:
该选项会累积而不覆盖。
警告:
如果需要生成多线程应用程序,或者需要将应用程序链接到多线程库,必须使用 -mt 选项编译和链接程序,而不是直接使用 -lthread 链接应用程序。(请参见 -mt)
- -libmieee
-
该选项已过时,在将来的发行版中将被删除。改用 -xlibmieee。
- -libmil
-
该选项已过时,在将来的发行版中将被删除。改用 -xlibmil。
- -library= lib[, lib...]
-
将指定的 CC 提供的库加入编译和链接操作中。
使用 -library 选项指定 CC 提供的库时,将在编译期间设置适当的 -I 路径,并在链接期间设置适当的 -L、-Y、-P 和 -R 路径以及 -l 选项。
值:
应用于某子选项的前缀 no% 会禁用该子选项。
下表显示 lib 值的含义。
- [ no%] f77
-
已过时。不使用。使用 -xlang=f77。
- [ no%] f90
-
已过时。不使用。使用 -xlang=f90。
- [ no%] f95
-
已过时。不使用。使用 -xlang=f95。
- [ no%] interval
-
已过时。不使用。使用 -xia。
- [ no%] iostream
-
使用传统 iostream 库 libiostream。
- [ no%] Cstd
-
使用 libCstd,它是 C++ 标准库(包括编译器提供的 C++ 标准库头文件)。
- [ no%] stlport4
-
使用标准库的 STLport 实现,而不是使用缺省 libCstd。用 -library=stlport4 编译的代码与用缺省的 -library=Cstd 或可选的 -library=stdcxx4 编译的代码不能用在同一程序中。
- [ no%] stlport4_dbg
-
使用 STLport 的支持调试的库。
- [ no%] stdcxx4
-
使用安装为 Oracle Solaris 一部分的 Apache stdcxx 版本 4 库,而不是使用缺省的 libCstd。此选项还会隐式设置 -mt 选项。stdcxx 库需要使用多线程模式。必须在整个应用程序的每个编译和链接命令中一致使用此选项。用 -library=stdcxx4 编译的代码与用缺省的 -library=Cstd 或可选的 -library=stlport4 编译的代码不能用在同一程序中。
- [ no%] Crun
-
使用 C++ 运行时库 libCrun。
- [ no%] gc
-
使用 libgc 垃圾收集。
- [ no%] sunperf
-
使用 Sun 性能库。
- %none
-
仅使用 C++ 库 libCrun。
请注意,不允许使用 -library=libC。
缺省值:
libCstd 库总是包括在内,除非使用 -library=%none、-library=no%Cstd、-library=stdcxx4 或 -library=stlport4 明确将其排除。
另外,始终会包括 libm 和 libc 库,即使指定了 -library=%none。始终会包括 libCrun。
示例:
要在不使用任何 C++ 库(libCrun 除外)的情况下链接,请使用:
example% CC -library=%none
如果同时包括 libCstd 和 libiostream,必须小心不要在程序内使用 iostreams 的旧形式和新形式(例如 cout 和 std::cout)来访问相同文件。如果从传统和标准 iostream 代码访问同一文件,那么在相同的程序中混合标准 iostream 和传统 iostream 可能会出现问题。
交互:
如果指定了 -xnolib,则忽略 -library。
如果使用 -library 指定了库,则在编译期间会设置适当的 -I 路径。在链接期间会设置适当的 -L、-Y、-P、-R 路径和 -l 选项。
该选项会累积而不覆盖。
只能在同一命令行中指定 -library=stlport4、-library=stdcxx4 或 -library=Cstd 中的最多一个。
不能在同一个命令行上使用 -library=sunperf 和 -xlic_lib=sunperf。
在使用区间运算库时,必须包括以下库之一:libCstd 或 libiostream。
指定的库在系统支持库链接之前链接。
警告:
所谓的“传统”iostream 是指 iostream 的初始 1986 版本,已被 1998 C++ 标准替代。它可通过 -library=iostream 选项选择。没有两个“传统”iostream 的实现是相同的,因此除了已过时之外,使用它的代码还不可移植。请注意,该库在以后的 Oracle Solaris Studio 发行版中将停止使用。
请勿重新定义或修改 STLport 或 Oracle Solaris Studio C++ 库的任何配置宏。配置和生成的库适用于 C++ 编译器。修改配置宏将导致程序无法编译、链接或正常运行。
如果在不同的步骤中进行编译和链接,那么必须在链接命令中显示在编译命令中显示的那组 -library 选项。
库的集合不稳定,会因不同的发行版本而变化。
另请参见:
-I、-l、-R、-staticlib、-xia、-xlang、-xnolib、《C++ Interval Arithmetic Programming Reference》、《C++ Standard Reference Library》
- -m32| -m64
-
指定编译的二进制对象的内存模型。
使用 -m32 创建 32 位可执行文件和共享库。使用 -m64 创建 64 位可执行文件和共享库。
在所有 Oracle Solaris 平台和不支持 64 位的 Linux 平台上,ILP32 内存模型(32 位 int、long、pointer 数据类型)是缺省值。在启用了 64 位的 Linux 平台上缺省为 LP64 内存模型(64 位 long 和指针数据类型)。-m64 仅允许在支持 LP64 模型的平台上使用。
使用 -m32 编译的对象文件或库不能同使用 -m64 编译的对象文件或库链接。
使用 -m64 编译具有大量静态数据的应用程序时,可能还需要 -xmodel=medium。请注意,部分 Linux 平台不支持中等模型。
使用 -m32|-m64 编译的模块还必须使用 -m32 |-m64 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C++ 用户指南。
注意,在以前的编译器发行版中,通过选择带有 -xarch 的指令集来实现内存模型 ILP32 或 LP64 。从 Sun Studio 12 编译器开始,就不再是这样了。在大多数平台上,仅需向命令行添加 -m64 即可创建 64 位对象。
在 Oracle Solaris 上,-m32 为缺省值。在支持 64 位程序的 Linux 系统上,缺省为 -m64 -xarch=sse2。
另请参见 -xarch。
- -mc
-
从对象文件的 .comment 部分中删除重复字符串。使用 -mc 选项时,会调用 mcs -c 命令。(请参见 mcs(1) 手册页。)
- -misalign
-
(SPARC)(已过时)不应使用此选项。应改用 -xmemalign=2i 选项。
- -mr[ , string]
-
从对象文件的 .comment 部分中删除所有字符串,如果提供了 string,则将 string 放入该部分。如果字符串包含空格,就必须使用引号将该字符串括入。如果使用此选项,会调用命令 mcs -d [-a string]。
交互:
如果指定 -S,此选项将无效。
- -mt[ ={ yes| no}]
-
使用此选项,可以通过 Oracle Solaris 线程或 POSIX 线程 API 编译和链接多线程代码。-mt=yes 选项确保按正确的顺序链接库。
此选项将 -D_REENTRANT 传递给预处理程序。
要使用 Oracle Solaris 线程,请包括 thread.h 头文件并使用 -mt=yes 选项进行编译。要在 Oracle Solaris 平台上使用 POSIX 线程,请包括 pthread.h 头文件并使用 -mt=yes 选项进行编译。
在 Linux 平台上,只有 POSIX 线程 API 可用。(Linux 平台上没有 libthread)。因此,Linux 平台上的 -mt=yes 会添加 -lpthread,而不是 -lthread。要在 Linux 平台上使用 POSIX 线程,请使用 -mt 进行编译。
请注意,当使用 -G 进行编译时,-ltread 和 -lpthread 均不会自动包括在 -mt=yes 内。生成共享库时,您需要显式列出这些库。
-xopenmp 选项(用于使用 OpenMP 共享内存并行化 API)自动包括 -mt=yes。
如果使用 -mt=yes 进行编译并在单独的步骤中进行链接,则除了在编译步骤中外,还必须在链接步骤中使用 -mt=yes 选项。如果使用 -mt=yes 编译和链接一个转换单元,则必须使用 -mt=yes 编译和链接该程序的所有单元。
-mt=yes 是编译器的缺省行为。如果不想出现该行为,请使用选项 -mt=no。
选项 -mt 等效于 -mt=yes。
另请参见:-xnolib
- -native
-
使用 -xtarget=native。
- -noex
-
使用 -features=no%except。
- -nofstore
-
(x86) 取消命令行上的 -fstore。
取消强制表达式具有 -fstore 调用的目标变量精度。
-nofstore 由 -fast 调用。-fstore 是常用缺省值。
- -nolib
-
该选项已过时,在将来的发行版中将被删除。改用 -xnolib。
- -nolibmil
-
该选项已过时,在将来的发行版中将被删除。改用 -xnolibmil。
- -noqueue
-
(已过时)此选项不会进行任何操作。
- -norunpath
-
不将共享库的路径生成到可执行文件中。
如果可执行文件使用共享库,编译器通常会生成将运行时链接程序指向这些共享库的路径。为此,编译器会将 -R 选项传递给 ld。路径取决于安装编译器的目录。
建议用该选项生成提交到客户(这些客户的程序使用的共享库可能具有不同路径)的可执行文件。
交互:
如果使用编译器安装区域(缺省位置 <installpath>/lib)下的任何共享库,并且还使用 -norunpath,那么就应该在链接时使用 -R 选项或在运行时设置环境变量 LD_LIBRARY_PATH 来指定共享库的位置。这样做使运行时链接程序可以找到共享库。
- -O
-
-O 宏会扩展为 -xO3。使用此选项进行编译将产生较高的运行时性能。但是,对于依赖于被自动视为 volatile 的所有变量的程序,优化级别 -xO3 可能不适用。可能做出此假定的典型程序包括设备驱动程序,以及实现其自己的同步基元的旧版多线程应用程序。解决方法是使用 -xO2 而非 -O 进行编译。
- -O[ level]
-
使用 -xOlevel。
- -o filename
-
将输出文件命名为 filename,而非缺省的 a.out。filename 不能与 sourcefile 相同,因为 cc 不会覆盖源文件。
filename 必须具有合适的后缀。当与 -c 一起使用时,filename 指定目标 .o 对象文件;当与 -G 一起指定时,它指定目标 .so 库文件。此选项及其参数将传递给 ld。
- +p
-
忽略非标准预处理程序声明。
缺省值:
如果没有 +p,则编译器识别非标准预处理程序声明。
交互:
如果使用 +p,则不会定义 sun、unix、sparc 和 i386。
- -P
-
仅预处理源文件:不编译。(输出文件的后缀为 .i 。)
该选项不在输出中包括预处理程序类型的行号信息。
- -p
-
(已过时)请参见 -xpg。
- -pentium
-
(x86) 使用 -xtarget=pentium。
- -pg
-
该选项已过时,在将来的发行版中将被删除。改用 -xpg。
- -PIC
-
(SPARC) 与 -xcode=pic32 相同。
(x86) 与 -KPIC 相同。
- -pic
-
(SPARC) 与 -xcode=pic13 相同。
(x86) 与 -Kpic 相同。
- -preserve_argvalues[= simple| none]
-
(x86) 在堆栈中保存基于寄存器的函数参数的副本。
如果指定了 none 或者如果未在命令行上指定 -preserve_argvalues 选项,则编译器行为像往常一样。
指定 simple 时,最多保存六个整数参数。
对于形式参数的赋值,值在函数生命周期内不会更新。
- -pta
-
使用 -template=wholeclass。
- -pti path
-
为模板源文件指定附加搜索目录。
此选项是对 -Ipathname 设置的正常搜索路径的替代。如果使用了 -ptipath 标志,编译器将在该路径上查找模板定义文件,并忽略 -Ipathname 标志。
使用 -Ipathname 标志而不是 -ptipath 将产生较少混乱。
交互:
该选项会累积而不覆盖。
- -pto
-
使用 -instances=static。
- -ptv
-
使用 -verbose=template。
- -Qoption phase option[ , option...]
-
将 option 传递到编译 phase。
要传递多个选项,按照逗号分隔列表的顺序指定它们。可以对使用 -Qoption 传递给组件的选项进行重新排序。驱动程序识别的选项将按正确顺序排列。对于驱动程序已识别的选项,请勿使用 -Qoption。例如,C++ 编译器识别用于链接程序 (ld) 的 -z 选项。如果发出如下命令
CC -G -zallextract mylib.a -zdefaultextract ... // correct
会按顺序将 -z 选项传递给链接程序。但是,如果指定如下命令
CC -G -Qoption ld -zallextract mylib.a -Qoption ld -zdefaultextract ... // error
则可能重新排列 -z 选项,得出不正确的结果。
下表显示了 phase 的可能值。
SPARC x86 ccfe ccfe iropt iropt cg ube CClink CClink ld ld
示例:
当 CC 驱动程序在以下命令中调用 ld 时,-Qoption 会将 -i 选项传递到 ld:
example% CC -Qoption ld -i test.cc
警告:
请注意避免无法预料的结果。例如,
-Qoption ccfe -features=bool,iddollar
被解释为
-Qoption ccfe -features=bool -Qoption ccfe iddollar
正确的用法为
-Qoption ccfe -features=bool,-features=iddollar
请注意,这些功能不需要 -Qoption,仅用作示例。
- -qoption phase option
-
使用 -Qoption。
- -qp
-
与 -p 相同。
- -Qproduce sourcetype
-
使 CC 驱动程序生成类型为 sourcetype 的源代码。下表显示了源代码类型。
- .i
-
来自 ccfe 的预处理 C++ 源代码
- .o
-
来自代码生成器的对象文件
- .s
-
来自代码生成器的汇编程序源
- -qproduce sourcetype
-
使用 -Qproduce。
- -R path[: path...]
-
将动态库搜索路径生成到可执行文件中。
该选项传递给 ld。
缺省值:
如果 -R 选项不存在,将在输出对象中记录缺省库搜索路径并将其传递给运行时链接程序。通过使用 -dryrun 选项并检查 ld 调用的 -Y 选项,可查看缺省库搜索顺序。
交互:
该选项会累积而不覆盖。
如果同时指定了 LD_RUN_PATH 环境变量和 -R 选项,则扫描 -R 指定的路径而忽略 LD_RUN_PATH 指定的路径。
另请参见:-norunpath
- -S
-
编译并仅生成汇编代码。该选项使 CC 驱动程序编译程序并输出汇编源文件,但不汇编程序。汇编源文件名称的后缀为 .s。
- -s
-
将符号表与可执行文件分离。该选项从输出可执行文件中删除所有符号信息。该选项传递给 ld。
- -staticlib= l[, l...]
-
指示 -library 选项(包括其缺省值)、-xlang 选项和 -xia 选项指定的哪些 C++ 库将静态链接。
值:
l 必须为以下值之一。
- [ no%] library
-
静态链接 library。library 的有效值包括 -library 的全部有效值(除 %all 和 %none 之外)、-xlang 和 interval(要与 -xia 结合使用)的全部有效值。使用前缀 no% 禁用 library 链接。
- %all
-
静态链接 -library 选项中指定的所有库、-xlang 选项中指定的所有库以及区间库(如果指定了 -xia)。
- %none
-
不静态链接在 -library 选项和 -xlang 选项中指定的库。如果在命令行上指定了 -xia,则不静态链接区间库。
缺省值:
如果未指定 -staticlib,则假定 -staticlib=%none。
交互:
该选项会累积而不覆盖。
除缺省情况下隐式选择的 C++ 库之外,-staticlib 选项仅对使用 -xia、-xlang 选项以及 -library 选项显式选择的 C++ 库有效。Cstd 和 Crun 是缺省选择的。
示例:
以下命令静态链接 libCrun,因为 Crun 是 -library 的缺省值。
(正确)example% CC -staticlib=Crun test.cc
但以下命令并不链接 libgc,因为只有使用 -library 选项显式指定才链接 libgc。
(不正确)example% CC -staticlib=gc test.cc
(正确)example% CC -library=gc -staticlib=gc test.cc
警告:
库的允许值集合不确定,会随发行版的不同而异。
在 Oracle Solaris 平台上,系统库不可用作静态库。
选项 -staticlib=Crun 和 -staticlib=Cstd 在 64 位 Oracle Solaris x86 平台上不适用。您应该动态链接支持库,除非有特殊需要想静态链接支持库。在某些情况下,静态链接会导致程序无法正常使用。
- -std= v
-
v 是必需的,且为以下值之一:
- c++03(数字零-3,不是字母 o-3)
-
选择 C++ 03 版本 (dialect) 与 g++ 二进制兼容性。与 -compat=g 选项等效。
- c++11
-
选择 C++ 11 版本 (dialect) 与 g++ 二进制兼容性。
- c++0x(数字零-x,不是字母 o-x)
-
等效于 c++11。
- sun03
-
等效于 -compat=5。
如果显示多个 -std 选项,只有最后一个选项(最右侧)有效。
交互:
-compat 和 -std 选项不能显示在同一个命令行上。
如果指定 -std,则不能使用以下任何一个 -library 子选项:Cstd、Crun、iostream、stlport4 和 stdcxx4。
使用 -std=c++11 编译时,您只能在有限功能模式(选项 -l)下使用 ()discover1。
注:
C++11 版本 (dialect) 无法使用 -compat=5 二进制兼容性。
- -sync_stdio=[ yes| no]
-
当运行时性能因 C++ iostreams 和 C stdio 之间的同步而降低时,可使用此选项。仅当您在相同的程序中使用 iostream 写入 cout 以及使用 stdio 写入 stdout 时,才需要同步。C++ 标准要求同步,因此缺省情况下 C++ 编译器打开同步。但是,不使用同步时,应用程序性能通常更佳。如果您的程序既不写入 cout 也不写入 stdout,则可以使用选项 -sync_stdio=no 关闭同步。
缺省值:
如果未指定 -sync_stdio,编译器会将其设置为 -sync_stdio=yes。
示例:
请看以下示例:
#include <stdio.h> #include <iostream> int main() { std::cout << " Hello "; printf("beautiful "); std::cout << "world!"; printf(" "); }
使用同步时,程序自行输出在一行中
Hello beautiful world!
不使用同步时,输出会变得杂乱。
警告:
此选项仅对链接可执行文件有效,对库无效。
- -temp= path
-
为临时文件定义目录。
该选项将 path 设置为在编译过程中生成的临时文件的目录。对于 -temp 设置的值和 TMPDIR 值,编译器优先采用前者。
另请参见:-keeptmp
- -template= a[, a...]
-
启用/禁用各种模板选项。
a 必须为以下值之一。应用于某子选项的前缀 no% 会禁用该子选项。
- [ no%] extdef
-
在独立的源文件中搜索模板定义。
- [ no%] geninlinefuncs
-
实例化显式实例化类模板的之前未生成的内联成员函数。
- [ no%] wholeclass
-
实例化整个模板类,而不仅仅是所使用的这些函数。必须至少引用一个类成员;否则,编译器不会实例化类的任何成员。
如果指定了 -template=no%extdef,则编译器会预定义宏 _TEMPLATE_NO_EXTDEF。
缺省值:
-template=no%wholeclass,no%extdef,no%geninlinefuncs
- -time
-
该选项已过时,在将来的发行版中将被删除。改用 -xtime。
- -traceback[ ={ %none| common| signals _ list}]
-
如果执行中出现严重错误,将发出堆栈跟踪。
当程序生成某些信号时,-traceback 选项会导致可执行文件向 stderr 发出堆栈跟踪、信息转储并退出。如果多个线程都生成一个信号,则只为第一个生成堆栈跟踪。
要使用回溯,请在链接时将 -traceback 选项添加到编译器命令行中。编译时也接受该选项,除非生成可执行二进制文件,否则将忽略此选项。使用 -traceback 和 -G 创建共享库是个错误。
- %none
- none
-
禁用回溯。
- common
-
指定如果生成一组常见信号(sigill、sigfpe、sigbus、sigsegv 和 sigabrt)中的任何一个,则应该发出堆栈跟踪。
- signals_list
-
指定应生成堆栈跟踪的信号名称的逗号分隔列表,采用小写形式。可以捕捉以下信号(导致生成信息转储文件的信号):sigquit、sigill、sigtrap、sigabrt、sigemt、sigfpe、sigbus、sigsegv、sigsys、sigxcpu 和 sigxfsz。
在上述任一信号前加上 no% 可以禁用信号缓存。
例如:如果生成 sigsegv 或 sigfpe,-traceback=sigsegv,sigfpe 将生成堆栈跟踪和信息转储。
如果不指定该选项,则缺省值为 -traceback=%none
没有任何 = 号的 -traceback 表示 -traceback=common
注意:如果不需要信息转储,用户可以使用以下方法将 coredumpsize 限制设置为零:
% limit coredumpsize 0
-traceback 选项不影响运行时性能。
- -U name
-
删除预处理程序符号 name 的初始定义。此选项可删除由 -D 在同一命令行上创建的宏符号 name 的任何初始定义,包括由命令行驱动程序明确放置在此的定义。
该选项对任何其他预定义的宏和源文件中的宏定义都没有影响。
要查看命令行驱动程序放在命令行上的 -D 选项,请将 -dryrun 选项添加到命令行上。
可以在命令行上指定多个 -U 选项。
示例:
以下命令取消预定义符号 __sun 的定义。test.cc 中的预处理程序语句(例如 #ifdef(__sun))会知道该符号已取消定义。
example% CC -U__sun test.cc
交互:
该选项会累积而不覆盖。
所有 -U 选项都在出现的任何 -D 选项之后处理。
- -unroll= n
-
该选项已过时,在将来的发行版中将被删除。改用 -xunroll=n。
- -V
-
与 –verbose=version 相同。
- -v
-
与 –verbose=diag 相同。
- -verbose= a[, a...]
-
控制编译器详细内容。
a 必须为以下值之一。应用于某子选项的前缀 no% 在与 %all 一起使用时将禁用该子选项。
- [ no%] template
-
打开模板实例 verbose 模式(有时称为检验模式)。verbose 模式显示编译过程中出现的每个实例阶段。
- [ no%] diags
-
为每个编译传递输出命令行。
- [ no%] version
-
指示CC驱动程序输出它调用的程序的名称和版本号。
- %all
-
调用上述全部命令。
- %none
-
不调用上述任何一个。
缺省值:
如果未指定 -verbose,则编译器假定 -verbose=%none。
交互:
该选项会累积而不覆盖。
- -W c, arg
-
将参数 arg 传递到组件 c。每个参数与前一个参数之间必须仅以逗号分隔。(逗号可以是参数的一部分,方法是紧挨在逗号前面添加反斜杠 () 字符对其进行转义;反斜杠将从生成的参数中删除。)所有 -W 参数均在常规命令行参数之后进行传递。
c 可以是以下值之一:
- a
-
汇编程序:(fbe)、(gas)
- c
-
C++ 代码生成器:(cg)(SPARC)
- d
-
CC 驱动程序
- l
-
链接编辑器 (ld)
- m
-
mcs
- O
-
(大写字母 'O')过程间优化器
- o
-
后优化器
- p
-
预处理程序 (cpp)
- 0
-
(数字零)编译器 (ccfe)
- 2
-
优化器:(iropt)
注意:不能使用 -Wd 将本手册页中列出的 CC 选项传递给 C++ 编译器。
-Wa,-o,objfile 可按相应的顺序将 -o 和 objfile 传递给汇编程序;此外,-Wl,-I,name 可使链接阶段覆盖动态链接程序 /usr/lib/ld.so.1 的缺省名称。
将参数传递给工具的顺序(相对于所指定的其他命令行选项)可能会更改。
- +w
-
标识可能产生不可预料结果的代码。
(使用 +w 选项时,如果函数过大而无法内联或未使用声明的程序元素,就不再生成警告。这些警告不指定源代码中的真正问题,因此不适合某些开发环境。从 +w 中删除这些警告就可以在这些环境下更主动地使用 +w。在 +w2 选项中仍可以使用这些警告。)
生成在下列方面有问题的构造的更多相关警告:
- 不可移植
- 可能出错
- 低效
缺省值:
如果未指定 +w,则编译器发出有关极可能是问题的构造的警告。
交互:
使用 +w 汇编时,一些 C++ 标准头文件会生成警告。
- +w2
-
发出由 +w 发出的相同警告以及关于技术违规的警告,这些技术违规可能是无害的,但可能会降低程序的最大可移植性。
+w2 选项不再发出关于在系统头文件中使用与实现相关的构造方面的警告。因为系统头文件是实现,所以发出警告是不合适的。从 +w2 删除这些警告可以更主动地使用该选项。
警告:
使用 +w2 汇编时,一些 Oracle Solaris 软件和 C++ 标准头文件会生成警告。
- -w
-
抑制警告消息。
该选项使编译器不输出警告消息。不能抑制某些警告(尤其是有关严重记时错误的警告)。
- -Xlinker arg
-
将 arg 传递给链接程序 ld (1) 。与 -z arg 等效。
- -Xm
-
使用 -features=iddollar。
- -xaddr32[ ={ yes| no}]
-
(x86/x64) -xaddr32=yes 编译标志可将生成的可执行文件或共享对象限制到 32 位地址空间。
以这种方式编译的可执行文件会导致创建限定为 32 位地址空间的进程。
指定 -xaddr32=no 时,会生成常见的 64 位二进制文件。
如果未指定 -xaddr32 选项,则假定 -xaddr32=no。
如果仅指定了 -xaddr32,则假定 -xaddr32=yes。
此选项仅适用于 -m64 编译,并且仅在支持 SF1_SUNW_ADDR32 软件功能的 Oracle Solaris 平台上适用。
由于 Linux 内核不支持地址空间限制,此选项在 Linux 上不可用。在 Linux 上将忽略 -xaddr32 选项。
链接时,如果单个对象文件是使用 -xaddr32=yes 编译的,则假定整个输出文件是使用 -xaddr32=yes 编译的。
限定为 32 位地址空间的共享对象必须由在受限的 32 位模式地址空间内执行的进程装入。
有关更多信息,请参阅《链接程序和库指南》中介绍的 SF1_SUNW_ADDR32 软件功能定义。
- -xalias_level[ = n]
-
允许编译器执行基于类型的别名分析。
缺省值:
n 必须是 any、simple 或 compatible。
- -xalias_level
-
如果未指定 -xalias_level,编译器会将其设置为 -xalias_level=any。如果指定了 -xalias_level,但没有指定任何值,则该编译器将其设置为 -xalias_level=compatible。
- -xalias_level=any
-
在此分析级别上,编译器假定任何类型都可以为其他类型起别名。不过尽管只是假定,但还是可以执行某些优化。
- -xalias_level=simple
-
编译器假定基本的类型没有别名。具体来说,存储对象的动态类型为下列基本类型之一:
- char、signed char 和 unsigned char
- wchar_t
- short int、unsigned short int
- int、unsigned int
- long int、unsigned long int
- long long int、unsigned long long int
- float、double、long double
- 枚举类型
- 数据指针类型
- 函数指针类型
- 数据成员指针类型
- 函数成员指针类型
只能通过以下类型的左值访问:
- 对象的动态类型
- 对象动态类型的不变或可变限定版本
- 与动态对象类型对应的带符号或不带符号的类型
- 与动态类型对象的不变或可变限定版本对应的有符号或无符号类型
- 在其成员(包括递归的子集成员或包含的联合)中包括上述类型的聚集或联合类型
- char 或 unsigned char 类型
- -xalias_level=compatible
-
编译器假定布局不兼容类型没有别名。存储对象只能通过以下类型的左值访问:
- 对象的动态类型
- 对象动态类型的不变或可变限定版本
- 与动态对象类型对应的带符号或不带符号的类型
- 与动态类型对象的不变或可变限定版本对应的有符号或无符号类型
- 在其成员(包括递归的子集成员或包含的联合)中包括上述类型的聚集或联合类型
- 动态类型对象的(可能是不变或可变限定)基类类型
- char 或 unsigned char 类型
编译器假定所有引用的类型都与相应存储对象的动态类型是布局兼容的。两种类型在以下情况下是布局兼容的:
- 如果两种类型为相同的类型,则它们是布局兼容类型。
- 如果两种类型仅在不变和可变限定方面存在区别,则它们是布局兼容类型。
- 对于每个带符号的整数类型,都存在对应(但不同)的不带符号的整数类型。这些对应类型是布局兼容的。
- 如果两个枚举类型具有相同的基础类型,则它们是布局兼容的。
- 如果两个简单旧数据 (plain old data, POD) 结构类型具有相同数量的成员,并且对应的成员(按顺序)具有布局兼容的类型,那么这两个结构类型是布局兼容的。
- 如果两个 POD 联合类型具有相同数量的成员,并且对应的成员(按顺序)具有布局兼容的类型,那么这两个联合类型是布局兼容的。
在某些情况下具有存储对象动态类型的引用可能是非布局兼容的:
- 如果 POD 联合包含了两个或两个以上共享通用初始序列的 POD 结构,且 POD 联合对象当前包含了其中一个 POD 结构,就可以检查任何 POD 结构的通用初始部分。对包含一个或多个初始成员的序列来说,如果相应成员具有布局兼容类型(适用于位字段)和相同宽度,则两个 POD 结构共享一个通用初始序列。
- 指向 POD 结构对象的指针(使用 reinterpret_cast 适当转换)将指向该结构的初始成员,而如果该成员是位字段则指向该结构所在的单元。
交互:
编译器在-xO2和更低的优化级别不执行基于类型的别名分析。
- -xanalyze={ code| %none}
-
(已过时)在以后的发行版中将删除此选项。改用 -xprevise。
使用该选项编译可生成能使用代码分析器查看的源代码静态分析。
使用 -xanalyze=code 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 -xanalyze=code。
缺省值为 -xanalyze=%none。
在 Linux 上,需要指定 -xanalyze=code 和 -xannotate。
有关详细信息,请参见 Oracle Solaris Studio 代码分析器文档。
- -xannotate[ ={ yes| no}]
-
指示编译器创建可供优化和监测工具 binopt(1)、code-analyzer(1)、discover(1)、collect(1) 和 uncover(1) 以后使用的二进制文件。
在 Oracle Solaris 上的缺省值为 -xannotate=yes。在 Linux 上的缺省值为 -xannotate=no。指定不带值的 -xannotate 等效于 -xannotate=yes。
要最好地利用优化和监测工具,在编译和链接时都必须采用 -xannotate=yes。
如果不使用优化和监测工具,则使用 -xannotate=no 进行编译和链接可以生成略小的二进制文件和库。
- -xar
-
创建归档文件库。
生成使用模板的 C++ 归档文件时,多数情况下需要将在模板系统信息库中实例化的那些模板函数包括在该归档文件中。仅在使用 -instances=extern 选项编译了至少一个对象文件时才使用模板系统信息库。结合 -xar 使用时,可以根据需要自动将这些模板添加到归档文件中。
但是,由于编译器在缺省情况下不使用模板高速缓存,因此通常不需要使用 -xar 选项。您可以使用标准系统 ar(1) 命令创建 C++ 代码的 .a 归档文件,除非某些代码是使用 -instances 编译的。在这种情况下,应改用 -xar 编译器选项。
值:
对调用 ar -c-r 指定 -xar 并重新创建归档文件。
示例:
以下命令归档包含在系统信息库和对象文件中的模板函数。
example% CC -xar -o libmain.a a.o b.o c.o
警告:
请勿在命令行上添加来自模板资料档案库中的 .o 文件。
请勿直接使用 ar 命令生成归档文件。应使用 CC -xar 以确保模板实例自动包括在归档文件中。
另请参见: ar (1)
- -xarch=isa
-
指定目标体系结构指令集 (ISA)。
通过只允许指定的指令集,此选项可将编译器生成的代码限定于指定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。不过,使用此选项会影响二进制程序的可移植性。请参见本条目结尾的“附注”和“警告”部分。
注意:编译器和链接程序会标记需要特定指令集体系结构 (instruction set architecture, ISA) 的 .o 文件和可执行文件,以便如果正在运行的系统不支持该特定 ISA,不会在运行时装入可执行文件。
注意:分别使用 -m64 或 -m32 选项来指定打算使用的内存模型 LP64(64 位)或 ILP32(32 位)。-xarch 标志不再指示内存模型,除非是为了与早期的发行版兼容,如下所示。
如果代码使用的 _asm 语句或内联模板(.il 文件)使用了特定于体系结构的指令,则在编译时可能需要使用相应的 -xarch 值以避免出现编译错误。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。
值(所有平台):
- generic
-
该选项使用大多数处理器通用的指令集。这是缺省值,等效于 -xarch=sse2。
- generic64
-
为了在大多数 64 位平台上获得良好性能而进行编译。(仅限 Oracle Solaris)
该选项等效于 -m64 -xarch=generic,提供该选项是为了与早期的发行版兼容。使用 -m64 可指定 64 位编译而非 -xarch=generic64。
- native
-
为了在此系统上获得良好性能而进行编译。
编译器为运行它的当前系统处理器选择适当的设置。
- native64
-
为了在此系统上获得良好性能而进行编译(仅限 Oracle Solaris)。
该选项等效于 -m64 -xarch=native,提供该选项是为了与早期的发行版兼容。
SPARC 平台上的值:
- sparc
-
针对 SPARC-V9 ISA 进行编译。
针对 V9 ISA 进行编译,但不具备可视指令集 (Visual Instruction Set, VIS),也不具备特定于其他实现的 ISA 扩展。该选项在 V9 ISA 上使编译器生成高性能代码。
- sparc4
-
针对 SPARC-V9 ISA 的 SPARC4 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)中的指令以及混合浮点乘加指令、VIS 3.0 和 SPARC4 指令。
- sparc4b
-
针对 SPARC-V9 ISA 的 SPARC4B 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展中的指令以及 SPARC T4 扩展中的 PAUSE 和 CBCOND 指令。
- sparc4c
-
针对 SPARC-V9 ISA 的 SPARC4C 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展、VIS 3.0 指令的 VIS3B 子集、SPARC T3 扩展的子集中的指令以及 SPARC T4 扩展中的 PAUSE 和 CBCOND 指令。
- sparcace
-
针对 SPARC-V9 ISA 的 sparcace 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展以及面向 SPARCACE 浮点的 SPARC64 X 扩展中的指令。
- sparcaceplus
-
针对 SPARC-V9 ISA 的 sparcaceplus 版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展、面向 SPARCACE 浮点的 SPARC64 X 扩展以及面向 SPARCACE 浮点的 SPARC64 X+ 扩展中的指令。
- sparcvis
-
针对 SPARC-V9 ISA 和 VIS 进行编译。
针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。
- sparcvis2
-
针对具有 UltraSPARC III 扩展的 SPARC-V9 ISA 进行编译。
此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视化指令集 (Visual Instruction Set, VIS) 2.0 版上生成对象代码。
- sparcvis3
-
针对具有 UltraSPARC III 和 VIS 3 扩展的 SPARC-V9 ISA 进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0、UltraSPARC-III 扩展(包括可视指令集版本 2.0)以及混合乘加指令和可视指令集 (Visual Instruction Set, VIS) 版本 3.0 中的指令。
- sparcfmaf
-
针对 SPARC-V9 ISA 的sparcfmaf版本进行编译。
允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。
请注意,必须将 -xarch=sparcfmaf 与 -fma=fused 以及某些优化级别结合使用,来使编译器尝试寻找机会自动使用乘加指令。
- sparcima
-
针对 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 扩展中的指令。
- v9
-
等效于 -m64 -xarch=sparc。使用 -xarch=v9 来获取 64 位内存模型的传统 makefile 和脚本仅需要使用 -m64。
- v9a
-
与 -m64 -xarch=sparcvis 等效,提供该选项是为了与早期发行版兼容。
- v9b
-
与 -m64 -xarch=sparcvis2 等效,提供该选项是为了与早期发行版兼容。
注:
传统 32 位 SPARC 指令集体系结构 V7 和 V8 隐含 -m32,因此无法使用 -m64 编译。
使用 sparc 和 sparcvis 编译的对象二进制文件 (.o) 可以链接起来并一起执行,但只能在与 sparcvis 兼容的平台上进行这些操作。
使用 sparc、sparcvis 和 sparcvis2 编译的对象二进制文件 (.o) 可以链接起来并一起执行,但只能在与 sparcvis2 兼容的平台上进行这些操作。
对于任何特定选择,生成的可执行文件在早期体系结构上运行可能会慢很多。此外,尽管这些指令集体系结构中的许多体系结构中有四精度浮点指令,但是编译器不在其生成的代码中使用这些指令。
特定于 x86 平台的值:
- avx2
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES、PCLMULQDQ、AVX、FSGSBASE、RDRND、F16C、AVX2、BMI1、BMI2、LZCNT、INVPCID 和 FMA 指令。
- avx_i
-
可以使用 386、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES、PCLMULQDQ AVX、FSGSBASE、RDRND 和 F16C 指令。
- avx
-
可以使用 386、MMX、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES 和 PCLMULQDQ smf AVX 指令。
- aes
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AES 和 PCLMULQDQ 指令。
- sse4_2
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3、SSE4.1 和 SSE4.2 指令。
- sse4_1
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3、SSSE3 和 SSE4.1 指令。
- ssse3
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2、SSE3 和 SSSE3 指令。
- sse3
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2 和 SSE3 指令。
- amdsse4a
-
使用 AMD SSE4a 指令集。
- sse2
-
可以使用 386、MMX、Pentium_pro、SSE 和 SSE2 指令。
- sse2a
-
可以使用 386、MMX、Pentium_pro、SSE、SSE2 和 AMD 扩展:3DNow!-AMD 处理器的 3DNow! 扩展指令。
- amd64
-
传统标志,等效于 -m64 -xarch=sse2,在 -m64 标志可用之前用于获取 64 位内存模型代码。
- amd64a
-
传统标志,等效于 -m64 -xarch=sse2a,在 -m64 标志可用于 AMD 处理器之前用于获取 64 位内存模型代码。
- sse
-
可以使用 386、MMX、Pentium_pro 和 SEE 指令。
- ssea
-
可以使用 386、MMX、Pentium_pro、SSE 和 AMD 扩展:3DNow!-AMD 处理器的 3DNow! 扩展指令。
- pentium_pro
-
可以使用 386、MMX 和 pentium_pro 指令。
- pentium_proa
-
可以使用 386、MMX、Pentium_pro 和 AMD 扩展:3DNow!-AMD 处理器的 3DNow! 扩展指令。
- generic
-
使用大多数处理器通用的指令集。
- generic64
-
传统标志,等效于 -m64 -xarch=generic,在 -m64 标志可用之前用于获取 64 位内存模型代码。
- native
-
使用编译器运行所在的当前系统处理器上可用的指令。
- native64
-
传统标志,等效于 -m64 -xarch=native,在 -m64 标志可用之前用于获取 64 位内存模型代码。
注:
如果在 x86 平台上使用 -m64 编译或链接了某个程序的任意部分,则该程序的所有部分也都必须使用这些选项之一进行编译。
有关各种 Intel 指令集体系结构(SSE、SSE2、SSE3、SSSE3 等)的详细信息,请参阅 Intel-64 和 IA-32《Intel Architecture Software Developer's Manual》。
缺省值:
如果未指定 -xarch=isa,则缺省值为 -xarch=generic(对于 SPARC 平台)和 -xarch=generic(对于 x86 平台)。
交互:
尽管可以单独使用该选项,但它是 -xtarget 选项的扩展的一部分,并且可用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。
例如,-xtarget=ultra4 扩展到 -xarch=sparcvis2 -xcache=64/32/4:8192/128/2 -xchip=ultra4。
警告:
如果此选项与优化一起使用,则在指定的体系结构上,适当的选择可以为可执行文件提供良好性能。但如果选择不当就会导致性能的严重降级,或导致在预定目标平台上无法执行二进制程序。
- -xautopar
-
为多个处理器启用自动并行化。执行依赖性分析(对循环进行迭代间数据依赖性分析)和循环重构。如果优化级别不是 -xO3 或更高,则将优化级别提高到 -xO3 并发出警告。
请注意,-xautopar 不接受 OpenMP 并行化指令。
如果要进行自己的线程管理,请勿使用 -xautopar。
为了使执行速度更快,该选项要求使用多处理器系统。在单处理器系统中,生成的二进制文件的运行速度通常较慢。
当运行由 -xautopar 编译器选项自动并行化的程序时,请使用 OMP_NUM_THREADS 环境变量指定要使用的线程数。如果未设置 OMP_NUM_THREADS,则使用的缺省线程数为 2。要使用多个线程,请将 OMP_NUM_THREADS 设置为更大的值。将 OMP_NUM_THREADS 设置为 1,则会仅使用一个线程运行。通常,会将 OMP_NUM_THREADS 设置为运行系统上可用的虚拟处理器数,可使用 Oracle Solaris psrinfo(1M) 命令确定该值。有关更多信息,请参见 OpenMP API 用户指南。
如果使用 -xautopar 且在一个步骤中进行编译和链接,则链接会自动将微任务化库和线程安全的 C 运行时库包含进来。如果使用 -xautopar,而且在不同的步骤中进行编译和链接,则还必须使用 CC -xautopar 进行链接。
- -xbinopt={ prepare| off}
-
(SPARC)此选项现在已过时,在编译器的将来发行版中会被删除。请参见 -xannotate。
指示编译器准备二进制文件,以便以后进行优化、转换和分析(请参见 binopt(1))。此选项可用于生成可执行文件或共享对象。此选项必须与 -xO1 或更高的优化级别一起使用时才有效。使用此选项生成二进制文件时,文件大小会有所增加。
如果在不同的步骤中进行编译,则在编译步骤和链接步骤中都必须有 -xbinopt:
example% CC -c -xO1 -xbinopt=prepare a.cc b.cc
example% CC -o myprog -xbinopt=prepare a.o
如果有些源代码不可用于编译,仍可使用此选项来编译其余代码。然后,应将其用于可创建最终库的链接步骤中。在此情况下,只有用此选项编译的代码才能进行优化、转换或分析。
使用 -xbinopt=prepare 和 -g 编译会将调试信息包括在内,从而增加可执行文件的大小。缺省值为 -xbinopt=off。
- -xbuiltin[ ={ %all| %default| %none}]
-
使用 -xbuiltin 选项可改善对调用标准库函数的代码的优化。此选项使编译器可在对性能有益时替换内函数或内联系统函数。要了解如何解读编译器注释输出来确定编译器替换了哪些函数,请参见 er_src(1) 手册页。
使用 -xbuiltin=%all 时,替换会导致 errno 的设置变得不可靠。如果您的程序依赖于 errno 的值,请不要使用此选项。
-xbuiltin=%default 仅内联未设置 errno 的函数。errno 的值在任何优化级别上都始终是正确的,并且可以可靠地检查。对于 -xO3 或更低级别的 -xbuiltin=%default,编译器将确定哪些调用对内联有益,并且不内联其他函数。
-xbuiltin=%none 选项可禁用库函数的所有替换。
如果没有指定 -xbuiltin,则在以优化级别 -xO1 或更高级别进行编译时缺省值为 -xbuiltin=%default,而在以 -xO0 级别进行编译时,缺省值为 -xbuiltin=%none。如果指定不带参数的 -xbuiltin,则缺省值为 -xbuiltin=%all,并且编译器会更加主动地替换内部函数或内联标准库函数。
使用 -fast 进行编译会添加 -xbuiltin=%all。
注意:-xbuiltin 选项仅内联系统头文件中定义的全局函数,而从不内联用户定义的静态函数。尝试在全局函数上进行插入的用户代码可能会导致出现不确定的行为。
- -xcache= c
-
定义供优化器使用的高速缓存属性。
c 必须是以下值之一:
- generic
- native
- s1/l1/a1[/t1]
- s1/l1/a1[/t1]:s2/l2/a2[/t2]
- s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
si、li、ai 和 ti 定义如下:
- si
-
级别为 i 的数据高速缓存的大小(千字节)
- li
-
级别为 i 的数据高速缓存的行大小(字节)
- ai
-
级别为 i 的数据高速缓存的关联性
- ti
-
在级别 i 共享高速缓存的硬件线程数。ti 参数是可选的。如果未提供值,则使用值 1。
该选项指定了优化器可以使用的缓存属性,不保证使用每个特定的缓存属性。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
-xcache 值为:
- generic
-
定义高速缓存属性,以便在大多数平台上获得良好性能。这是缺省值。
- native
-
定义高速缓存属性,以便在此主机平台上获得良好性能。
- s1/l1/a1[/t1]
-
定义 1 级高速缓存属性。
- s1/l1/a1[/t1]:s2/l2/a2[/t2]
-
定义 1 级和 2 级高速缓存属性。
- s1/l1/a1[/t1]:s2/l2/a2[/t2]:s3/l3/a3[/t3]
-
定义 1 级、2 级和 3 级缓存属性。
- -xchar= o
-
提供该选项的目的只是为了在 char 类型定义为无符号的系统上简化代码的迁移。如果不是从这样的系统中迁移,最好不要使用该选项。只有那些依赖字符类型符号的程序才需要重写,它们要改写成显式指定带符号或者无符号。
值:
可以将 o 替换为以下值之一:
- signed
-
将声明为字符的字符常量和变量视为带符号的。这会影响已编译代码的行为,而不影响库例程的行为。
- s
-
等效于 signed。
- unsigned
-
将声明为字符的字符常量和变量视为无符号的。这会影响已编译代码的行为,而不影响库例程的行为。
- u
-
等效于 unsigned。
缺省值:
如果未指定 -xchar,编译器将假定 -xchar=s。如果指定了 -xchar 但未指定值,编译器将假定 -xchar=s。
交互:
对于使用 -xchar 编译的代码,-xchar 选项仅更改 char 类型的值范围。该选项不会更改任何系统例程或头文件中char类型的值范围。特别是,指定该选项时,limits.h 定义的 CHAR_MAX 和 CHAR_MIN 的值不会更改。因此,CHAR_MAX 和 CHAR_MIN 不再表示无格式 char 中可编码的值的范围。
警告:
如果使用 -xchar,则在将 char 与预定义的系统宏进行比较时要特别小心,原因是宏中的值可能带符号。对于任何返回错误代码而且可以用宏来访问错误代码的例程,此情况是最常见的。错误代码一般是负值,因此在将char与此类宏中的值进行比较时,结果始终为假。负数永远不等于无符号类型的值。
强烈建议切勿使用 -xchar 编译通过库导出的任何接口的例程。Oracle Solaris ABI 将char类型指定为带符号,并且系统库的行为也与此相适应。目前还未对系统库针对将char指定为无符号的效果进行广泛测试。可以不使用该选项,而是修改代码使其与char类型是否带符号没有关联。类型char的符号因编译器和操作系统而异。
- -xcheck[ = n]
-
对堆栈溢出启用运行时检查。
值:
n 必须为以下值之一。
- %all
-
执行全部检查。
- %none
-
不执行任何检查。
- stkovf[ action]
-
生成代码以便在运行时检测堆栈溢出错误,可以选择指定检测到堆栈溢出错误时要执行的操作。
当设置的线程堆栈指针超过为线程分配的堆栈边界时,便会出现堆栈溢出错误。如果堆栈地址的新顶端可写入,则无法检测到错误。
如果内存访问违规作为错误的直接结果发生,从而发出关联信号(通常是 SIGSEGV),则会检测到堆栈溢出错误。我们说由此发出的信号与错误关联。
未检测到的堆栈溢出错误可能导致无提示数据损坏。防止未检测到的堆栈溢出错误需要编译器和运行时支持。
如果指定了 -xcheck=stkovf[action],当堆栈帧大于系统页面大小时,编译器会生成代码来检测堆栈溢出错误。代码包括库调用以强制内存访问违规而非将堆栈指针设置为无效但有可能映射的地址(请参见 _stack_grow(3C))。
如果指定了可选的 action,它必须是以下几项之一:
- :detect
-
如果 action 为 :detect,则通过执行通常与错误关联的信号处理程序来处理检测到的堆栈溢出错误。
- :diagnose
-
如果 action 为 :diagnose,则通过捕获关联信号并调用 stack_violation(3C) 诊断错误来处理检测到的堆栈溢出错误。这是没有指定 action 时的缺省行为。
如果内存访问违规诊断为堆栈溢出错误,则会将以下消息输出到 stderr:
ERROR: stack overflow detected: pc=<inst_addr>, sp=<sp_addr>
其中 <inst_addr> 是检测到错误处指令的地址,<sp_addr> 是检测到错误时堆栈指针的值。检查堆栈溢出并输出以上消息(如果适用)后,控制能力传递给通常与错误关联的信号处理程序。
-xcheck=stkovf:detect 可将进入时的堆栈边界检查添加到堆栈帧大于系统页面大小的例程(请参见 _stack_grow(3C))。在大多数应用程序中,额外边界检查的相对成本应该微乎其微。
-xcheck=stkovf:diagnose 可将系统调用添加到线程创建(请参见 sigaltstack(2))。额外系统调用的相对成本取决于应用程序创建和销毁新线程的频率。
-xcheck=stkovf 仅在 Oracle Solaris 上受支持。Linux 上的 C 运行时库不支持堆栈溢出检测。
- no%stkovf
-
关闭堆栈溢出检查。
- init_local
-
初始化局部变量。有关编译器用于初始化变量的预定义值的列表,请参见 C 用户指南中对该选项的描述。
- no%init_local
-
不初始化局部变量。
交互:
如果指定了没有任何参数的 -xcheck,则编译器缺省使用 -xcheck=%none。
- -xchip= c
-
指定供优化器使用的目标处理器。
尽管该选项可单独使用,但它是 -xtarget 选项扩展的一部分;其主要用途是覆盖 -xtarget 选项提供的值。
此选项通过指定目标处理器来指定计时属性。
此选项会影响:
- 指令的顺序,即调度
- 编译器使用分支的方法
- 语义上等价的其他指令可用时使用的指令
对于 SPARC 平台,-xchip 的值为:
- generic
-
使用计时属性,以便在大多数 SPARC 处理器上获得良好性能。
这是缺省值,该值指示编译器在多数 SPARC 处理器上使用最佳计时属性来获得高性能,而不会使任何处理器的性能明显下降。
- native
-
设置在主机环境中最佳性能的参数。
- sparc64vi
-
针对 SPARC64 VI 处理器进行优化。
- sparc64vii
-
针对 SPARC64 VII 处理器进行优化。
- sparc64x
-
针对 SPARC64 X 处理器进行优化。
- sparc64xplus
-
针对 SPARC64 X+ 处理器进行优化。
- super
-
针对 SuperSPARC 处理器进行优化。
- super2
-
针对 SuperSPARC II 处理器进行优化。
- micro
-
针对 MicroSPARC(TM) 处理器进行优化。
- micro2
-
针对 MicroSPARC II 处理器进行优化。
- hyper
-
针对 HyperSPARC(TM) 处理器进行优化。
- hyper2
-
针对 HyperSPARC II 处理器进行优化。
- ultra
-
针对 UltraSPARC(TM) 处理器进行优化。
- ultra2
-
针对 UltraSPARC II 处理器进行优化。
- ultra2e
-
针对 UltraSPARC IIe 处理器进行优化。
- ultra2i
-
针对 UltraSPARC IIi 处理器进行优化。
- ultra3
-
针对 UltraSPARC III 处理器进行优化。
- ultra3cu
-
针对 UltraSPARC IIIcu 处理器进行优化。
- ultra3i
-
针对 UltraSPARC IIIi 处理器进行优化。
- ultra4
-
针对 UltraSPARC IV 处理器进行优化。
- ultra4plus
-
针对 UltraSPARC IVplus 处理器进行优化。
- ultraT1
-
针对 UltraSPARC T1 处理器进行优化。
- ultraT2
-
针对 UltraSPARC T2 处理器进行优化。
- ultraT2plus
-
针对 UltraSPARC T2+ 处理器进行优化。
- T3
-
针对 SPARC T3 处理器进行优化。
- T4
-
针对 SPARC T4 处理器进行优化。
- T5
-
针对 SPARC T5 处理器进行优化。
- M5
-
针对 SPARC M5 处理器进行优化。
- sparc64viiplus
-
针对 SPARC64 VII plus 处理器进行优化。
注意:以下 SPARC -xchip 值已过时,在将来的发行版中可能会删除:ultra、ultra2、ultra2e、ultra2i、ultra3、ultra3cu、ultra3i、ultra4 和 ultra4plus。
对于 x86 平台,-xchip 的值为:
- generic
-
进行优化,以在大多数 x86 处理器上实现良好性能。
- native
-
针对此主机处理器进行优化。
- core2
-
针对 Intel Core2 处理器进行优化。
- nehalem
-
针对 Intel Nehalem 处理器进行优化。
- opteron
-
针对 AMD Opteron 处理器进行优化。
- penryn
-
针对 Intel Penryn 处理器进行优化。
- pentium
-
针对 Intel Pentium 处理器进行优化。
- pentium_pro
-
针对 Intel Pentium Pro 处理器进行优化。
- pentium3
-
针对 Intel Pentium 3 处理器进行优化。
- pentium4
-
针对 Intel Pentium 4 处理器进行优化。
- sandybridge
-
针对 Intel Sandy Bridge 处理器进行优化。
- ivybridge
-
针对 Intel Ivy Bridge 处理器进行优化。
- haswell
-
针对 Intel Haswell 处理器进行优化。
- westmere
-
针对 Intel Westmere 处理器进行优化。
- amdfam10
-
针对 AMD FAM10 处理器进行优化
- -xcode= a
-
(SPARC)指定代码地址空间。
注意:强烈建议通过指定 -xcode=pic13 或 -xcode=pic32 来生成共享对象。可以使用 -m64 -xcode=abs64 生成可工作的共享对象,但这些对象的效率将会很低。使用 -m64 -xcode=abs32 或 -m64 -xcode=abs44 生成的共享对象将不起作用。
下表显示了 -xcode 值。
- abs32
-
生成快速但有范围限制的 32 位绝对地址。代码 + 数据 + bss 的大小被限制为 232 字节。这是 32 位体系结构的缺省值。
- abs44
-
(SPARC) 生成具有适当速度和范围的 44 位绝对地址。代码+数据+bss 的大小不应超过 244 字节。这是 64 位体系结构的缺省值。请勿将该值与动态(共享)库一起使用。
- abs64
-
(SPARC) 生成缓慢但无范围限制的 64 位绝对地址。只适用于 64 位架构。
- pic13
-
生成快速但有范围限制的位置无关代码(小模型)。等同于 -Kpic。允许在 32 位体系结构中最多引用 211 个唯一的外部符号,而在 64 位体系结构中可以最多引用 210 个。
- pic32
-
生成速度慢但包含完整范围的位置无关代码(大模型)。等同于 -KPIC。允许在 32 位体系结构中最多引用 230 个唯一的外部符号,而在 64 位体系结构中可以最多引用 229 个。
要确定是使用 -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。
缺省值:
对于 32 位体系结构,缺省值是 -xcode=abs32。
对于 64 位处理器,缺省值是 -xcode=abs44。
警告:
在不同的步骤中进行编译和链接时,必须在编译步骤和链接步骤中使用相同的 -xarch 选项。
- -xdebugformat=[ stabs| dwarf]
-
使用此选项可控制编译器生成的调试器信息的格式。在使用 -g 等调试选项时会生成调试器信息。即使不使用调试选项,也会生成少量调试器信息。
-xdebugformat=stabs 生成使用 stabs 格式的调试信息。stabs 格式已过时并不再受支持。
-xdebugformat=dwarf 生成的调试信息采用标准 dwarf 格式。
缺省值:
-xdebugformat 选项需要一个参数。
如果未指定 -xdebugformat,编译器将假定 -xdebugformat=dwarf。
交互:
使用 g++ ABI(二进制格式)时,无法使用 stabs 格式。不能为选项 -compat=g 或 -std=v(无论 v 值为何)指定 -xdebugfomat=stabs。
注:
stabs 或 dwarf 格式下各个字段的详细格式可能会逐渐出现。
另请参见 dumpstabs (1) 和 dwarfdump (1) 的手册页。
- -xdebuginfo= a[ , a...]
-
控制发出多少调试和监测信息。
术语 tagtype 是指标记的类型:结构、联合、枚举和类。
以下列表包含子选项 a 的可能值。应用于某子选项的前缀 no% 会禁用该子选项。缺省值为 -xdebuginfo=%none。禁止指定不带子选项的 -xdebuginfo。
- %none
-
不生成任何调试信息。这是缺省值。
- [ no%] line
-
发出行号和文件信息。
- [ no%] param
-
发出参数的位置列表信息。发出标量值(例如 int、char *)的完整类型信息以及类型名称,但是不发出 tagtype 的完整定义。
- [ no%] variable
-
发出词法上全局和局部变量的位置列表信息,包括文件和函数静态信息,但是不包括类静态和外部信息。发出标量值(例如 int 和 char *)的完整类型信息以及类型名称,但是不发出 tagtype 的完整定义。
- [ no%] decl
-
发出关于函数和变量声明、成员函数以及类声明中的静态数据成员的信息。
- [ no%] tagtype
-
发出从 param 和 variable 数据集引用的 tagtype 的完整类型定义以及模板定义。
- [ no%] macro
-
发出宏信息。
- [ no%] codetag
-
发出 DWARF 代码标记(又称为 Stabs N_PATCH)。这是有关由 RTC 和 discover 使用的位字段、结构副本以及溢出的信息。
- [ no%] hwcprof
-
生成对硬件计数器分析至关重要的信息。该信息包括 ldst_map-从 ld/st 指令到引用的符号表条目的映射,以及分支目标地址的 branch_target 表-用于验证回溯是否未跨分支目标。有关更多信息,请参见 -xhwcprof。
注意:ldst_map 需要提供 tagtype 信息。如果不满足这项要求,驱动程序会发出错误。
这些是扩展到 -xdebuginfo 组合及其他选项的宏,如下所示:
-g = -g2 -gnone = -xdebuginfo=%none -xglobalize=no -xpatchpadding=fix -xkeep_unref=no%funcs,no%vars -g0 = -xdebuginfo=line,param,decl,variable,tagtype -xglobalize=yes -xpatchpadding=fix -xkeep_unref=funcs,vars -g1 = -xdebuginfo=line,param,codetag -xglobalize=no -xpatchpadding=fix -xkeep_unref=no%funcs,no%vars -g2 = -xdebuginfo=line,param,decl,variable,tagtype,codetag -xglobalize=yes -xpatchpadding=fix +d # only if no "-O" flags are present; see +d -xkeep_unref=funcs,vars -g3 = -xdebuginfo=line,param,decl,variable,tagtype,codetag,macro -xglobalize=yes -xpatchpadding=fix +d # only if no "-O" flags are present; see +d -xkeep_unref=funcs,vars
- -xdepend[ =[ yes| no] ]
-
分析循环以了解迭代间数据依赖性并执行循环重构。循环重构包括循环互换、循环熔合、标量替换,以及消除“无用”数组赋值。
在 SPARC 上,-xdepend 为 -xO3 及以上的所有优化级别启用,为较低的优化级别禁用。此外,-xdepend 的显式设置会覆盖任何隐式设置。
在 x86 上,如果优化级别不是 -xO3 或更高,编译器会将优化级别提高到 -xO3 并发出警告。
如果未指定 -xdepend,缺省值为 -xdepend=no,表示编译器不会分析数据依赖性循环。如果指定了 -xdepend 但未指定参数,则编译器会将该选项设置为 -xdepend=yes,表示编译器会分析数据依赖性循环。
-xautopar 中包括依赖性分析。依赖性分析在编译时完成。
依赖性分析在单处理器系统中可能很有用。但是,如果您在单处理器系统上尝试 -xdepend,则不应使用 -xautopar。否则,将对多处理器系统执行 -xdepend 优化。
另请参见:-xprefetch_auto_type
- -xdumpmacros[ = value[ , value...]]
-
要查看宏在程序中如何工作时,请使用该选项。该选项提供了诸如宏定义、取消定义的宏和宏用法实例的信息,并按宏的处理顺序将输出输出到标准错误 (stderr)。-xdumpmacros 选项在文件结束前或在 dumpmacros 或 end_dumpmacros pragma 覆盖它之前都是有效的。
值:
应用于某子选项的前缀 no% 会禁用该子选项。
- [no%]defs
-
输出所有宏定义。
- [no%]undefs
-
输出所有取消定义的宏。
- [no%]use
-
输出关于使用的宏的信息。
- [no%]loc
-
另外输出定义、取消定义和使用的位置(路径名和行号)。
- [no%]conds
-
输出在条件指令中使用的宏的使用信息。
- [no%]sys
-
输出系统头文件中的宏的所有宏定义、取消定义和使用信息。
- %all
-
设置该选项即表示 -xdumpmacros=defs,undefs,use,loc,conds,sys。该参数最好与[no%]形式的其他参数配合使用。例如, -xdumpmacros=%all,no%sys 表示输出中不包含系统头文件宏,但仍提供所有其他宏的信息。
- %none
-
不输出任何宏信息。
该选项的值会累积,因此指定 -xdumpmacros=sys -xdumpmacros=undefs 与 -xdumpmacros=undefs,sys 的效果相同。
注意:子选项 loc、conds 和 sys 是 defs、undefs 和 use 选项的限定符。只使用 loc、conds 和 sys 本身没有任何作用。例如,使用 -xdumpmacros=loc,conds,sys 不会生成什么结果。
缺省值:
如果指定不带任何参数的 -xdumpmacros,则表示 -xdumpmacros=defs,undefs,sys。如果未指定 -xdumpmacros,则它缺省使用 -xdumpmacros=%none。
- -xe
-
仅检查语法和语义错误。指定 -xe 时,编译器不生成任何对象代码。-xe 的输出定向到 stderr。
如果不需要通过编译生成对象文件,可使用 -xe 选项。例如,如果要尝试通过删除代码段找出导致出现错误消息的原因,可使用 -xe 加速编辑和编译周期。
- -xF[ = v]
-
-xF 选项可使链接程序对函数和变量进行最佳重新排序。
该选项指示编译器将函数和/或数据变量放置到单独的分段中,这使链接程序(使用链接程序的 -M 选项指定的映射文件中的指示)可将这些段重新排序以优化程序性能。通常,该优化仅在缺页时间构成程序运行时间的一大部分时才有效。
为优化性能而对函数和变量进行重新排序时,需要执行以下操作:
- 使用 -xF 进行编译和链接。
- 按照性能分析器手册中关于如何生成函数的映射文件或《链接程序和库指南》中关于如何生成数据的映射文件的说明进行操作。
- 使用通过链接程序的 -M 选项生成的新映射文件重新链接。
- 在分析器下重新执行以验证是否增强。
值:
应用于某子选项的前缀 no% 会禁用该子选项。
v 可以为以下值之一:
- [ no%] func
-
将函数分段到单独的段中。
- [ no%] gbldata
-
将全局数据(具有外部链接的变量)分段到单独的段中。
- [ no%] lcldata
-
将局部数据(具有内部链接的变量)分段到单独的段中。
- %all
-
分段函数、全局数据和局部数据。
- %none
-
不对任何内容进行分段。
缺省值:
如果未指定 -xF,则缺省值为 -xF=%none。如果指定了没有任何参数的 -xF,则缺省值为 -xF=%none,func。
交互:
使用 -xF=lcldata 会限制某些地址计算优化,因此,只应在必要时才使用该标志。
另请参见:
analyzer(1)、ld(1)
- -xglobalize[ ={ yes| no}]
-
控制文件静态变量的全局化,但是不控制函数的全局化。
全局化是修复并继续和过程间优化所需的一项技术,文件静态符号借以提升到全局范围,同时为名称添加前缀以使命名相同的符号不同。
缺省值为 -xglobalize=no。指定 -xglobalize 与指定 -xglobalize=yes 等效。
交互:
请参见 -xpatchpadding。
-xipo 也需要全局化,并且将覆盖 -xglobalize。
- -xhelp=flags
-
显示了对每个编译器标志的简要描述。
- -xhwcprof[ ={ enable| disable}]
-
(SPARC) 使用 -xhwcprof 选项可为数据空间分析启用编译器支持。
如果启用了 -xhwcprof,编译器将生成信息,这些信息可帮助工具将分析的加载和存储指令与其所引用的数据类型和结构成员相关联(与使用 -g 生成的符号信息结合)。它将分析数据同对象文件的数据空间(而不是指令空间)相关联,并对行为进行洞察,而这仅从指令分析中是无法轻易获得的。
可以使用 -xhwcprof 编译指定的一组对象文件,不过将 -xhwcprof 应用于应用程序中的所有对象文件时,该选项最为有用。它能全面识别并关联分布在应用程序对象文件中的所有内存引用。
如果在不同的步骤中进行编译和链接,最好在链接时使用 -xhwcprof。如果将来扩展为 -xhwcprof,则在链接时可能需要使用它。
-xhwcprof=enable 或 -xhwcprof=disable 的实例将会覆盖同一命令行中 -xhwcprof 的所有以前的实例。
在缺省情况下,禁用 -xhwcprof。指定不带任何参数的 -xhwcprof 与 -xhwcprof=enable 等效。
-xhwcprof 要求启用优化,并将调试数据格式设置为 dwarf (-xdebugformat=dwarf),这是当前 Oracle Solaris Studio 编译器的缺省设置。不允许在同一命令行上出现 -xhwcprof 和 -xdebugformat=stabs。
-xhwcprof 使用 -xdebuginfo 自动启用所需的最少量调试信息,所以不需要 -g。
-xhwcprof 和 -g 的组合会增加编译器临时文件的存储需求,而且比单独指定 -xhwcprof 和 -g 所引起的增加总量还多。
-xhwcprof 作为宏实施,扩展到多个其他更原始的选项,如下所示:
-xhwcprof -xdebuginfo=hwcprof,tagtype,line -xhwcprof=enable -xdebuginfo=hwcprof,tagtype,line -xhwcprof=disable -xdebuginfo=no%hwcprof,no%tagtype,no%line
下列命令可编译 example.cc,并可为硬件计数器分析以及针对使用 DWARF 符号的数据类型和结构成员的符号分析指定支持:
example% CC -c -O -xhwcprof -g example.cc
有关基于硬件计数器的分析的更多信息,请参见性能分析器手册。
- -xia
-
链接合适的区间运算库并设置适当的浮点环境。
-xia 选项是一个扩展到 -fsimple=0 -ftrap=%none -fns=no -library=interval 的宏。
交互:
要使用区间运算库,请将 <suninterval.h> 包含进来。
在使用区间运算库时,必须包括以下库之一:Cstd 或 iostream。有关包括这些库的信息,请参见 -library。
警告:
如果您使用区间并为 -fsimple、-ftrap 或 -fns 指定了不同的值,则您的程序可能有不正确的行为。
C++ 区间运算处于实验阶段且正在改进。具体功能可能随发行版本而变。
在 x86 平台上,必须指定 -xarch=sse2 以进行 32 位编译。此外,在 Linux 平台上不能使用 -xia。
另请参见:-library、C++ Interval Arithmetic Programming Reference
- -xinline[ = func _ spec[, func _ spec...]]
-
指定用户编写的哪些例程可以被优化器以 -xO3 或更高级别内联。
值:
应用于某子选项的前缀 no% 会禁用该子选项。
func_spec 可以是下列值之一:
- %auto
-
在 -xO4 或更高的优化级别上启用自动内联。此参数告知优化器它可以内联所选择的函数。请注意,没有 %auto 规范,在命令行上通过以下项指定显式内联时,通常会关闭自动内联:
-xinline=[no%]func_name...
- func _ name
-
强烈请求优化器内联函数。如果函数未声明为 extern "C",则必须改编 func_name 的值。可以对可执行文件使用 nm 命令来查找改编的函数名。对于已声明为 extern "C" 的函数,编译器不改编名称。
- no% func _ name
-
如果为列表上的例程添加名称前缀 no%,则会禁止内联该例程。关于 func_name 已改编名称的规则也适用于 no%func_name。
只有使用了 -xipo[=1|2] 时,才会内联要编译的文件中的例程。优化器决定适合内联的例程。
缺省值:
如果未指定 -xinline 选项,则编译器假定 -xinline=%auto。如果指定了没有任何参数的 -xinline=,则不内联函数,而不管优化级别是什么。
示例:
要启用自动内联同时禁用内联声明为 int foo() 的函数,请使用以下命令:
example% CC -xO5 -xinline=%auto,no%__1cDfoo6F_i_ -c a.cc
要强烈要求内联声明为 int foo() 的函数,并使所有其他函数作为要内联的候选函数,请使用以下命令:
example% CC -xO5 -xinline=%auto, __1cDfoo6F_i_ -c a.cc
要强烈要求内联声明为 int foo() 的函数,且不允许内联任何其他函数,请使用:
example% CC -xO5 -xinline=__1cDfoo6F_i_ -c a.cc
交互:
优化级别低于 -xO3 时,-xinline 选项不起作用。在 -xO4 或更高的优化级别上,优化器会决定应该内联哪些函数,无需指定 -xinline 选项即可完成。另外,在 -xO4 或更高的优化级别上,编译器会尝试确定内联哪些函数可以提高性能。
如果出现以下任一情况,则会内联例程。
- 优化设置为 -xO3 或更高级别
- 认为内联有益且安全
- 函数在要编译的文件中,或函数在使用 -xipo[=1|2] 编译了的文件中。
警告:
如果使用 -xinline 强制内联函数,实际上可能会降低性能。
另请参见:-xldscope
- -xinline_param= a[ , a[ , a]...]
-
使用该选项可手动更改编译器用来确定何时内联函数调用的试探式方法。
该选项仅在 -O3 或更高级别上起作用。当自动内联处于启用状态时,以下子选项仅在 -O4 或更高级别上起作用。
在以下子选项中,n 必须是正整数;a 可以是以下几项之一:
- default
-
将所有子选项的值设置为缺省值。
- max_inst_hard[ : n]
-
自动内联只将小于 n 个伪指令(在编译器的内部表示中计数)的函数视为可能的内联候选函数。
在任何情况下,都不会考虑对大于该值的函数进行内联。
- max_inst_soft[ : n]
-
将内联函数的大小限制设置为 n 个伪指令(在编译器的内部表示中计数)。
有时可能会对大小大于该值的函数进行内联。
与 max_inst_hard 交互时,max_inst_soft 的值应该等于或小于 max_inst_hard 的值,即 max_inst_soft <= max_inst_hard。
一般而言,编译器的自动内联程序仅内联所调用函数的大小小于 max_inst_soft 的值的调用。在某些情况下,当函数大小大于 max_inst_soft 的值但小于 max_inst_hard 的值时,可能会内联函数。例如,当传递到函数中的参数是常量时。
当确定是否为了将一个特定调用点内联到函数中而更改 max_inst_hard 或 max_inst_soft 的值时,请使用 -xinline_report=2 报告详细的内联消息,并遵循内联消息中的建议。
- max_function_inst[ : n]
-
允许函数因自动内联而最多增加 n 个伪指令(在编译器的内部表示中计数)。
- max_growth[ : n]
-
允许自动内联程序将程序大小最多增大 n%,其中大小以伪指令数度量。
- min_counter[ : n]
-
为了考虑要自动内联的函数而通过分析反馈 (-xprofile) 度量的最小调用点频率计数。
仅当使用分析反馈 (-xprofile=use) 编译应用程序时,该选项才有效。
- level[ : n]
-
使用该子选项可控制所应用自动内联的程度。-xinline_param=level 的设置越高,编译器内联的函数越多。
n 必须为 1、2 或 3 之一。
当未指定该选项时或者当指定不带 :n 的选项时,n 的缺省值为 2。
指定自动内联的级别
level:1 basic inlining level:2 medium inlining (default) level:3 aggressive inlining
级别决定了为以下内联参数组合指定的值:
max_growth + max_function_inst + max_inst + max_inst_call
当级别为 1 时,所有参数都是缺省值的一半。
当级别为 2 时,所有参数都是缺省值。
当级别为 3 时,所有参数都是缺省值的两倍。
- max_recursive_depth[ : n]
-
当函数直接或间接调用自身时,我们说它进行递归调用。
该子选项可使递归调用自动内联到最高 n 级别。
- max_recursive_inst[ : n]
-
指定递归函数的调用方通过执行自动递归内联可增大到的最大伪指令数(在编译器的内部表示中计数)。
max_recursive_inst 与 max_recursive_depth 之间发生交互时,直到 max_recursive_depth 个递归调用或者直到内联到的函数的大小超过 max_recursive_inst,才会内联递归函数调用。这两个参数的设置控制小型递归函数的内联程度。
如果指定了 -xinline_param=default,编译器会将子选项的所有值设置为缺省值。
如果不指定该选项,则缺省值为 -xinline_param=default。
值和选项的列表从左至右进行累积。所以对于以下项的规范
-xinline_param=max_inst_hard:30,..,max_inst_hard:50
值 max_inst_hard:50 将传递给编译器。
如果在命令行上指定了多个 -xinline_param 选项,则子选项的列表同样从左至右进行累积。例如,
-xinline_param=max_inst_hard:50,min_counter:70 ... -xinline_param=max_growth:100,max_inst_hard:100
的效果等同于
-xinline_param=max_inst_hard:100,min_counter:70,max_growth:100
- -xinline_report[ = n]
-
该选项可生成在编译器内联函数时写入标准输出的报告。报告的类型取决于 n 的值,它必须为 0、1 或 2。
- 0
-
不生成报告。
- 1
-
生成内联参数缺省值的摘要报告。
- 2
-
生成内联消息的详细报告,显示已内联和未内联的调用点,并注明未内联调用点的简短原因。在某些情况下,该报告将包括针对可用于内联未内联的调用点的 -xinline_param 建议的值。
如果未指定 -xinline_report,则 n 的缺省值为 0。如果指定了不带 =n 的 -xinline_report,则缺省值为 1。
如果存在 -xlinkopt,则有关未内联的调用点的内联消息可能并不准确。
上述情况仅限于由一种编译器执行的内联,这种编译器受可由 -xinline_param 选项控制的试探的限制。出于其他原因由编译器内联的调用点可能不会报告这种情况。
- -xinstrument=[ no%] datarace]
-
指定此选项编译并检测您的程序,以供线程分析器进行分析。有关线程分析器的更多信息,请参见 tha(1) 了解详细信息。
然后可使用性能分析器以 collect -r races 运行检测过的程序,从而创建数据争用检测实验。可以单独运行已检测的代码,但其运行速度将非常缓慢。
值:
- datarace
-
准备供线程分析器分析的代码并定义 __THA_NOTIFY。
- no%datarace
-
这是缺省值。不准备供线程分析器分析的代码,也不定义 __THA_NOTIFY。
交互:
如果分步进行编译和链接,则必须在编译和链接步骤中都指定 -xinstrument=datarace。
此选项定义了预处理程序令牌 __THA_NOTIFY。可指定 #ifdef __THA_NOTIFY 来保护对 libtha(3) 例程的调用。
此选项还设置 -g0。
警告:
指定不带参数的 -xinstrument 是非法的。
- -xipo[ ={ 0| 1| 2}]
-
执行过程间优化。
-xipo 选项通过调用过程间分析传递来执行部分程序优化。它会在链接步骤中对所有对象文件执行优化,且优化不限于只是编译命令中的那些源文件。但是,使用 -xipo 执行的整个程序优化不包括汇编 (.s) 源文件。
编译和链接大型多文件应用程序时,-xipo 选项特别有用。用该标志编译的对象对象文件具有在这些文件内编译的分析信息,这些信息实现了在源代码和预编译的程序文件中的过程间分析。但分析和优化只限于使用 -xipo 编译的对象文件,并不扩展到对象文件或库。
值:
- 0
-
不执行过程间的优化。
- 1
-
执行过程间优化。
- 2
-
执行过程间的别名分析和内存分配及布局的优化,以提高缓存的性能。
缺省值:
如果未指定 -xipo,则假定 -xipo=0。
如果仅指定了 -xipo,则假定为 -xipo=1。
示例:
以下示例在相同的步骤中编译和链接。
example% CC -xipo -xO4 -o prog part1.cc part2.cc part3.cc
优化器在三个源文件之间执行交叉文件内联。该操作是在最终的链接步骤中完成的,因此源文件的编译工作不必全在一个编译过程中完成,可以跨多个不同的编译过程,但每个编译过程都需要指定 -xipo 选项。
以下示例在不同的步骤中编译和链接。
example% CC -xipo -xO4 -c part1.cc part2.cc
example% CC -xipo -xO4 -c part3.cc
example% CC -xipo -xO4 -o prog part1.o part2.o part3.o
在编译步骤中创建的对象文件具有在文件内部编译的附加分析信息,这样就可以在链接步骤中执行跨文件优化。
交互:
-xipo 选项要求优化级别至少为 -xO4。
警告:
在不同的步骤中进行编译和链接时,必须在这两个步骤中都指定 -xipo 才有效。编译时未使用 -xipo 的对象可以自由地与使用 -xipo 编译的对象链接。即使使用 -xipo 对库进行了编译,这些库也不参与交叉文件的过程间分析,如此示例中所示:
example% CC -xipo -xO4 one.cc two.cc three.cc
example% CC -xar -o mylib.a one.o two.o three.o
example% CC -xipo -xO4 -o myprog main.cc four.cc mylib.a
本示例中,在 one.cc、two.cc 和 three.cc 之间以及 main.cc 和 four.cc 之间执行过程间优化,但不在 main.cc 或 four.cc 和 mylib.a 中的例程之间执行过程间优化。第一个编译可能生成有关未定义符号的警告,但仍可执行过程间优化,因为过程间优化是编译和链接的一个步骤。
由于执行跨文件优化时需要附加信息,因此 -xipo 选项会生成更大的对象文件。不过,该附加信息不会成为最终的二进制可执行文件的一部分。可执行程序大小的增加都是由于执行的附加优化导致的。
何时不使用 -xipo=2 过程间分析:
在链接步骤中使用对象文件集合时,编译器试图执行整个程序分析和优化。对于该目标文件集合中定义的任何函数或子例程 foo(),编译器做出以下两个假定:
- foo() 无法在运行时被在该目标文件集合之外定义的其他例程显式调用。
- 来自该目标文件集合中的任何例程的 foo() 调用将不受在该目标文件集合以外定义的不同版本的 foo() 的干预。
如果假设 (1) 对于给定的应用程序不成立,请勿使用 -xipo=2 进行编译。
如果假定 (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() 中,从而导致出现错误的结果。
- -xipo_archive[ = a]
-
-xipo_archive 选项使编译器可在生成可执行文件之前,用通过 -xipo 编译且驻留在归档库 (.a) 中的对象文件来优化传递给链接程序的对象文件。库中包含的在编译期间优化的任何对象文件都会替换为其优化后的版本。
a 是以下值之一:
- writeback
-
生成可执行文件之前,编译器使用通过 -xipo 编译的对象文件(驻留在归档库 (.a) 中)来优化传递到链接程序的对象文件。库中包含的在编译期间优化的任何对象文件都会替换为优化后的版本。
对于使用归档库通用集的并行链接,每个链接都应创建自己的归档库备份,从而在链接前进行优化。
- readonly
-
生成可执行文件之前,编译器使用通过 -xipo 编译的对象文件(驻留在归档库 (.a) 中)来优化传递到链接程序的对象文件。
选项 -xipo_archive=readonly 启用对在链接时指定的归档库中的对象文件的跨模块内联和过程间数据流分析。但是,它不启用对归档库代码的跨模块优化,除非代码已经通过跨模块内联插入到其他模块中。
要对归档库中的代码应用跨模块优化,需要使用 -xipo_archive=writeback。请注意,这样做将修改从中提取代码的归档库的内容。
- none
-
缺省值。没有对归档文件的处理。编译器不会对使用 -xipo 编译和在链接时从归档库中提取的对象文件应用跨模块内联或其他跨模块优化。要执行此操作,链接时必须指定 -xipo,以及 -xipo_archive=readonly 或 -xipo_archive=writeback 中的任一个。
指定不带标志的 -xipo_archive 是非法的。
- -xipo_build=[yes| no]
-
在不设置 -xipo_build 的情况下生成 -xipo 涉及通过编译器的两次传递,一次是在生成对象文件时,再一次是随后在链接时执行跨文件优化时。设置 -xipo_build 可避免初始传递期间的优化而仅在链接时优化,从而缩短编译时间。无需对对象文件进行优化,与 -xipo 一样,将在链接时执行优化。如果使用 -xipo_build 生成的未优化对象文件链接起来而未包括 -xipo 来执行优化,则应用程序将因无法解析的符号错误而无法链接。
示例:
以下示例将执行 .o 文件的快速生成,后跟链接时跨文件优化:
% cc -O -xipo -xipo_build -o code1.o -c code1.c % cc -O -xipo -xipo_build -o code2.o -c code2.c % cc -O -xipo -o a.out code1.o code2.o
-xipo_build 将在创建 .o 文件时禁用 -O,以快速生成这些文件。链接时将执行完全 -O 优化,作为 -xipo 跨文件优化的一部分。
以下示例在不使用 -xipo 的情况下执行链接。
% cc -O -o a.out code1.o code2.o
如果使用 -xipo_build 生成了 code1.o 或 code2.o,结果将发生链接时故障,指明符号 __unoptimized_object_file 无法解析。
单独生成 .o 文件时,缺省行为是 -xipo_build=no。但是,当从源文件的一次传递中生成可执行文件或库时,将隐式启用 -xipo_build。例如:
% cc -fast -xipo a.c b.c c.c
将为生成 a.o、b.o 和 c.o 的第一次传递隐式启用 -xipo_build=yes。包括选项 -xipo_build=no 可禁用该行为。
- -xivdep[ = p]
-
禁用或设置 ivdep 程序的解释。
ivdep pragma 指示编译器忽略在循环中找到的部分或全部对数组引用的循环附带依赖性,以进行优化。这使得编译器可以执行各种循环优化,如微向量化、分发、软件流水操作等,其他情况下,无法执行这些优化。当用户知道这些依赖性无关紧要或者实际上永远不会发生时,可以使用该指令。
#pragma ivdep 指令的解释取决于 -xivdep 选项的值。
p 的以下值解释如下:
- loop
-
忽略假定的循环附带向量依赖性。
- loop_any
-
忽略所有循环附带向量依赖性。
- back
-
忽略假定的向后循环附带向量依赖性。
- back_any
-
忽略所有向后循环附带向量依赖性。
- none
-
不忽略任何依赖性(禁用 ivdep pragma)。
提供这些解释是为了与另一个供应商对 ivdep pragma 的解释兼容。
- -xjobs={ n| auto}
-
使用多个进程进行编译。如果未指定该标志,则缺省行为是 -xjobs=auto。
指定 -xjobs 选项可设置编译器完成其任务需创建的进程数。在多 CPU 计算机上,该选项可以缩短生成时间。目前,-xjobs 只能与 -xipo 选项一起使用。如果指定 -xjobs=n,过程间优化器就将 n 作为其在编译不同文件时可调用的最大代码生成器实例数。
通常,n 的安全值等于 1.5 乘以可用处理器数。如果使用的值是可用处理器数的数倍,则会降低性能,因为有在产生的作业间进行的上下文切换开销。此外,如果使用很大的数值会耗尽系统资源(如交换空间)。
如果指定了 -xjobs=auto,则编译器将自动选择适当数量的并行作业。
指定 -xjobs 时务必要指定值。否则会发出错误诊断并使编译终止。
如果未指定 -xjobs,则缺省行为是 -xjobs=auto。通过将 -xjobs=n 添加到命令行可覆盖该行为。在出现最合适的实例之前,-xjobs 的多个实例在命令行上会互相覆盖。
示例:
以下示例将与 -xipo 的最多 3 个并行进程链接:
% cc -xipo -xO4 -xjobs=3 t1.o t2.o t3.o
以下示例将与 -xipo 的一个进程串行链接:
% cc -xipo -xO4 -xjobs=1 t1.o t2.o t3.o
以下示例将与为 -xipo 选择作业数量的编译器并行链接:
% cc -xipo -xO4 t1.o t2.o t3.o
请注意,这与显式指定 -xjobs=auto 时的行为完全相同:
% cc -xipo -xO4 -xjobs=auto t1.o t2.o t3.o
- -xkeep_unref[ ={[ no%] funcs, [ no%] vars}]
-
保留未引用函数和变量的定义。no% 前缀使编译器有可能删除这些定义。
缺省值为 no%funcs、no%vars。指定 -xkeep_unref 等效于指定 -xkeep_unref=funcs,vars,表示 -keep_unref 保留一切。
- -xkeepframe[ =[ %all,%none, function _ name, no% function _ name]]
-
禁止对命名函数进行与堆栈相关的优化。
指定 %all 会对所有代码禁止与堆栈相关的优化。指定 %none 可允许对所有代码进行与堆栈相关的优化。
如果未在命令行上指定,则编译器假定 -xkeepframe=%none。
如果在命令行上指定了但不带值,则编译器假定 -xkeepframe=%all。
此选项是累积的,并且可以在命令行中出现多次。例如,
-xkeepframe=%all -xkeepframe=no%func1
指示应当为除 func1 以外的所有函数保留堆栈帧。而且,-xkeepframe 优先于 -xregs=frameptr。例如,
-xkeepframe=%all -xregs=frameptr
指示应保留所有函数的堆栈,但不会执行 -xregs=frameptr 的优化。
- -xlang= language[, language]
-
包含适当的运行库,并确保指定语言的正确运行时环境。
language 必须是 f77、f90、f95 或 c99。
-f90 和 -f95 参数等效。c99 参数表示为已使用 cc -std=c99 或 cc -xc99=%all 编译并要使用 CC 链接的对象调用 ISO 9899:1999 C 编程语言行为。
交互:
-xlang=f90 和 -xlang=f95 选项隐含了 -library=f90,而 -xlang=f77 选项隐含了 -library=f77。但是,-library=f77 和 -library=f90 options are not sufficient for mixed-language linking because only the -xlang 选项可确保正确的运行时环境。
要决定在混合语言链接中使用的驱动程序,请使用下列语言分层结构:
- C++
-
使用 CC 命令。
- Fortran 95(或 Fortran 90)
-
使用 f95 命令。有关详细信息,请参见 f95(1)。
- Fortran 77
-
使用 f95 -xlang=f77。有关详细信息,请参见 f95(1)。
- C
-
使用 cc 命令。有关详细信息,请参见 cc(1)。
将 Fortran 95、Fortran 77 和 C++ 对象文件链接在一起时,请使用最高级语言的驱动程序。例如,使用下列 C++ 编译器命令来链接 C++ 和 Fortran 95 对象文件。
example% CC -xlang=f95...
要链接 Fortran 95 和 Fortran 77 对象文件,请使用如下所示的 Fortran 95 驱动程序:
example% f95 -xlang=f77...
不能在同一编译器命令中同时使用 -xlang 选项和 -xlic_lib 选项。如果要使用 -xlang 且需要在 Sun 性能库中进行链接,应改用 -library=sunperf。
警告:
请勿将 -xnolib 与 -xlang 一起使用。
如果要将并行的 Fortran 对象与 C++ 对象混合,链接行必须指定 -mt flag。
另请参见:-library、-staticlib
- -xldscope={ v}
-
更改外部符号定义的缺省链接程序作用域。由于实现更隐蔽,因此更改缺省值可使共享库更快、更安全。
值
v 必须是下列值之一:
- global
-
符号定义具有全局链接程序作用域,它是限制最少的链接程序作用域。对符号的所有引用都绑定到定义符号的第一个动态装入模块中的定义。该链接程序作用域是外部符号的当前链接程序作用域。
- symbolic
-
符号定义具有符号链接程序作用域,它比全局链接程序作用域具有更多的限制。将对链接的动态装入模块内符号的所有引用绑定到模块内定义的符号。在模块外部,符号也显示为全局符号。该链接程序作用域对应于链接程序选项 -Bsymbolic。尽管不能将 -Bsymbolic 与 C++ 库一起使用,但可以使用 -xldscope=symbolic 选项,而不会引起问题。
- hidden
-
隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制。将动态装入模块内的所有引用绑定到该模块内的定义。符号在模块外部是不可视的。
缺省值:
如果未指定 -xldscope,编译器将假定 -xldscope=global。如果指定了没有任何值的 -xldscope,则编译器就会发出错误。在到达最右边的实例之前,命令行上此选项的多个实例相互覆盖。
警告:
如果要使客户端覆盖库中的函数,就必须确保该库生成期间未以内联方式生成该函数。如果您使用 -xinline 指定函数名称、以 -xO4 或更高级别编译(在这种情况下会自动发生内联)、使用内联说明符或使用跨文件优化,编译器会内联函数。
例如,假定库 ABC 具有缺省的分配器函数,该函数可用于库的客户端,也可在库的内部使用:
void* ABC_allocator(size_t size) { return malloc(size); }
如果在 -xO4 或更高级别生成库,则编译器将内联库组件中出现的对 ABC_allocator 的调用。如果库的客户端要用定制的版本替换 ABC_allocator,则在调用 ABC_allocator 的库组件中不能进行该替换。最终程序将包括函数的不同版本。
生成库时,用 __hidden 或 __symbolic 说明符声明的库函数可以内联生成。假定它们不被客户机覆盖。有关更多信息,请参见 C++ 用户指南中的第 4 章“语言扩展”。
用 __global 说明符声明的库函数不应内联声明,并且应该使用 -xinline 编译器选项来防止内联。
另请参见:-xinline、-xO、 ld (1) 。
- -xlibmieee
-
使 libm 在异常情况下对于数学例程返回 IEEE 754 值。libm 的缺省行为是兼容 XPG。
此选项会影响某些浮点数学库例程设置的 errno 变量的值。有关更多信息,请参见本手册页结尾的“附注”部分。
- -xlibmil
-
内联选定的库例程以进行优化。
某些 libm 库例程有内联模板。此选项会选择那些为当前使用的浮点选项和平台生成速度最快的可执行文件的内联模板。
注意:该选项不影响 C++ 内联函数。此选项会影响某些浮点数学库例程设置的 errno 变量的值。有关更多信息,请参见本手册页结尾的“附注”部分。
- -xlibmopt
-
使用优化数学例程的库。使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
此选项使用已优化性能的数学例程库,并且通常会生成运行速度更快的代码。结果可能与普通数学库产生的结果略有不同。如果有差别,通常是最后一位不同。
该库选项在命令行上的顺序并不重要。
交互:
-fast 选项隐含了该选项。
另请参见:-fast、-xnolibmopt
此选项会影响某些浮点数学库例程设置的 errno 变量的值。有关更多信息,请参见本手册页结尾的“附注”部分。
- -xlic_lib=sunperf
-
已过时,不使用。改为指定 -library=sunperf。
- -xlicinfo
-
编译器忽略此选项且不显示任何提示。
- -xlinkopt[ = level]
-
对可重定位对象文件执行链接时优化。
链接优化器在链接时对二进制对象代码执行一些高级性能优化。可以使用值 level 来设置执行的优化级别,且必须为 0、1 或 2。
优化级别为:
- 0
-
禁用链接优化器。(这是缺省情况。)
- 1
-
在链接时根据控制流分析执行优化,包括指令高速缓存着色和分支优化。
- 2
-
在链接时执行附加的数据流分析,包括无用代码删除和地址计算简化。
指定 -xlinkopt 时若不带级别参数,则表示 -xlinkopt=1。
这些优化在链接时通过分析二进制对象代码来执行。虽然未重写对象文件,但生成的可执行代码可能与初始对象代码不同。
当与分析反馈一起用于编译整个程序时,此选项最有效。
如果在不同的步骤中进行编译,则 -xlinkopt 必须既出现在编译步骤中,又出现在链接步骤中:
example% CC -c -xlinkopt a.cc b.cc example% CC -o myprog -xlinkopt=2 a.o
请注意,仅当编译器链接时才使用 level 参数。在上述示例中,即使编译二进制对象文件时使用的是隐含的级别 1,链接优化器的级别仍然是 2。
使用 -xlinkopt 编译时,请不要使用 -zcombreloc 链接程序选项。
必须至少在部分编译命令中使用 -xlinkopt,才能使 -xlinkopt 在链接时有效。优化器仍可以对未使用 -xlinkopt 进行编译的二进制对象文件执行部分受限的优化。
-xlinkopt 将优化位于编译器命令行上的静态库中的代码,但会跳过位于命令行上的共享(动态)库中的代码且不对其进行优化。生成共享库(用 -G 编译)时,您也可以使用 -xlinkopt。
与运行时分析反馈一起使用时,链接优化器最有效。分析功能会展示代码中最常用和最不常用的部分,并指示优化器相应地进行处理。这对大型应用程序尤为重要,因为在链接时执行代码优化放置可降低指令高速缓存未命中数。通常,会按照以下方式进行编译:
example% CC -o progt -xO5 -xprofile=collect:profdir file.cc example% progt example% CC -o prog -xO5 -xprofile=use:profdir -xlinkopt file.cc
有关使用分析反馈的详细信息,请参见 -xprofile。
注意,使用该选项编译会略微延长链接的时间,对象文件的大小也会增加,但可执行文件的大小保持不变。使用 -xlinkopt 和 -g 编译会将调试信息包括在内,从而增加了可执行文件的大小。
- -xloopinfo
-
显示哪些循环进行了并行化处理,哪些循环没有进行并行化处理。该选项通常与 -xautopar 选项一起使用。
- -xM
-
仅对指定的 C++ 程序运行预处理程序,请求生成 makefile 依赖性并将结果发送到标准输出(有关 makefile 和依赖性的详细信息,请参见 make (1))。
但是,-xM 只报告包含的头文件的依赖性,而不报告关联的模板定义文件的依赖性。可以使用 makefile 中的 .KEEP_STATE 功能在 make 创建的 .make.state 文件中生成所有依赖项。
有关 makefile 和依赖项的详细信息,请参见 make(1S)。
- -xM1
-
此选项与 -xM 一样,只是它不报告 /usr/include 头文件的依赖项,也不报告编译器提供的头文件的依赖项。
- -xMD
-
像 -xM 一样生成 makefile 依赖性,但编译继续。-xMD 为从 -o 输出文件名(如果指定)或输入源文件名派生的 makefile 依赖性信息生成一个输出文件,替换(或添加)后缀为 .d 的文件名。如果指定 -xMD 和 -xMF,预处理程序会将所有 makefile 依赖性信息写入到使用 -xMF 指定的文件中。不允许使用 -xMD -xMF 或 -xMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
- -xMF filename
-
使用该选项可指定 makefile 依赖性输出的文件。无法在一个命令行上使用 -xMF 为多个输入文件指定单独的文件名。不允许使用 -xMD -xMF 或 -xMMD -xMF 编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
此选项无法与 -xM 或 -xM1 一起使用。
- -xMMD
-
此选项用于生成不包含系统头文件的 makefile 依赖性。这一功能与 -xM1 的功能相同,但是编译会继续。-xMMD 为从 -o 输出文件名(如果指定)或输入源文件名派生的 makefile 相关项信息生成一个输出文件,替换(或添加)后缀为 .d 的文件名。如果您指定 -xMF,则编译器将改用您提供的文件名。不允许使用 -xMMD -xMF 或 -xMMD -o filename 来编译多个源文件,否则会生成错误。如果已存在依赖性文件,将覆盖该文件。
- -xMerge
-
将数据段和文本段合并。
对象文件中的数据是只读数据,并在进程之间共享,除非使用 ld -N 进行链接。
-xMerge、-ztext 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
- -xmaxopt[ = v]
-
此命令会将 pragma opt 级别限制为指定的级别。v 必须为下列值之一:off、1、2、3、4 或 5。缺省值为 -xmaxopt=off,表示忽略 pragma 优化。指定未提供参数的 -xmaxopt 等效于指定 -xmaxopt=5。
- -xmemalign[ = ab]
-
(SPARC) 使用 -xmemalign 选项可控制编译器对数据对齐所做的假定。通过控制可能会出现非对齐内存访问的代码和出现非对齐内存访问时的处理程序,可以更轻松的将程序移植到 SPARC。
指定假定的最大内存对齐以及未对齐的数据访问的行为。必须同时为 a(对齐)和 b(行为)提供值。a 指定最大假定内存对齐,b 指定未对齐内存访问行为。
对于可在编译时确定对齐的内存访问,编译器会为该数据对齐生成适当的装入/存储指令序列。
对于不能在编译时确定对齐的内存访问,编译器必须假定一个对齐以生成所需的装入/存储序列。
如果运行时的实际数据对齐小于指定的对齐,则未对齐的访问尝试(内存读取或写入)生成一个陷阱。对陷阱的两种可能响应如下所示:
- 操作系统将陷阱转换为 SIGBUS 信号。如果程序无法捕捉到信号,则程序终止。即使程序捕捉到信号,未对齐的访问尝试仍将无法成功。
- 操作系统通过翻译未对齐的访问并将控制返回给程序(仿佛访问已成功正常结束)来处理陷阱。
a 接受的值为:
- 1
-
假定最多 1 字节对齐。
- 2
-
假定最多 2 字节对齐。
- 4
-
假定最多 4 字节对齐。
- 8
-
假定最多 8 字节对齐。
- 16
-
假定最多 16 字节对齐。
b 接受的值为:
- i
-
解释访问并继续执行。
- s
-
产生信号 SIGBUS。
- f
-
仅适用于 64 位 SPARC 程序 (-m64)。针对少于或等于 4 的对齐产生信号 SIGBUS,否则将解释访问并继续执行。对于 32 位程序,f 标志与 i 等效。
如果要链接到某个已编译的对象文件,并且编译该对象文件时 b 的值设置为 i 或 f,就必须指定 -xmemalign。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C++ 用户指南。
缺省值:
针对 SPARC 64 位程序 (-m64) 的缺省值为 -xmemalign=8s。
针对 SPARC 32 位程序 (-m32) 的缺省值为 -xmemalign=8i。
如果指定了 -xmemalign 但未提供值,则针对所有平台的缺省值均为 -xmemalign=1i。
- -xmodel=[ a]
-
(x86) -xmodel 选项可确定 Oracle Solaris x64 平台上共享对象的数据地址模型,并且只应为此类对象的编译指定。
仅当启用了 64 位的 x64 处理器上还指定了 -m64 时,该选项才有效。
a 是以下值之一:
- small
-
此选项可为小模型生成代码,其中执行代码的虚拟地址在链接时已知,并且已知在 0 到 2^31 - 2^24 - 1 的虚拟地址范围内可以找到所有符号。
- kernel
-
按内核模型生成代码,在该模型中, 所有符号都定义在 2^64 - 2^31 到 2^64 - 2^24 范围内。
- medium
-
按中等模型生成代码,在该模型中,不对数据段的符号引用范围进行假定。文本段的大小和地址的限制与小型代码模型的限制相同。使用 -m64 编译含有大量静态数据的应用程序时,可能需要使用 -xmodel=medium。
此选项不累积,因此编译器根据命令行最右侧的 -xmodel 实例设置模型值。
如果未指定 -xmodel,编译器将假定 -xmodel=small。如果指定没有参数的 -xmodel,将出现错误。
不是编译所有转换单元时都需要使用此选项。只有可以确保访问的对象在可访问范围之内,才可编译选择的文件。
您应了解,不是所有的 Linux 系统都支持中等模型。
- -xnolib
-
禁止链接缺省系统库。
通常(不含该选项)情况下,C++ 编译器会链接多个系统库以支持 C++ 程序。使用该选项时,用于链接缺省系统支持库的 -llib 不会传递给 ld。
通常情况下,编译器按照以下顺序链接系统支持库:
对于缺省 -compat=5 模式:
-lCstd -lCrun -lm -lc
对于 Linux 上的 -compat=g,库为:
-lstdc++ -lCrunG3 -lm -lc
对于 Oracle Solaris 上的 -compat=g,库为:
-lstdc++ -lgcc_s -lCrunG3 -lm -lc
-l 选项的顺序非常重要。-lm 选项必须位于 -lc 之前。
注意:如果指定了 -mt 选项,编译器通常先与 -lthread 链接,然后再与 -lm 链接。
要确定在缺省情况下将链接哪些系统支持库,请使用 -dryrun 选项进行编译。例如,以下命令的输出:
CC foo.cc -m64 -dryrun
包括以下命令
-lCstd -lCrun -lm -lc
示例:
对于符合 C 应用程序二进制接口的基本编译(即只需要支持 C 的 C++ 程序),请使用:
CC -xnolib test.cc -lc
要将 libm 静态链接到具有通用指令集的单线程应用程序中,请使用:
CC -xnolib test.cc -lCstd -lCrun -Bstatic
交互:
在 Oracle Solaris 平台上,无法使用任何静态系统库。
如果指定了 -xnolib,就必须按给定顺序手动链接所有必需的系统支持库。必须最后链接系统支持库。
如果指定了 -xnolib,则忽略 -library。
警告:
许多 C++ 语言功能都要求使用 libCrun。
系统支持库的集合不稳定,可能会因不同的发行版本而变化。
- -xnolibmil
-
在命令行上取消 -xlibmil。
将该选项与 -fast 一起使用会忽略与优化数学库链接。
- -xnolibmopt
-
在命令行上取消 -xlibmopt。
交互:
在命令行上 -fast 选项后面使用该选项,如下所示:
example% CC -fast -xnolibmopt ...
- -xO n
-
指定优化级别 (n)。(请注意,大写字母 O,后跟数字 1、2、3、4 或 5。)
缺省为不优化。不过,只有不指定优化级别时才可能使用缺省设置。如果指定了优化级别,则没有任何选项可用来关闭优化。
如果尝试不设置优化级别,请不要指定任何隐含优化级别的选项。例如,-fast 是将优化级别设置为 -xO5 的宏选项。隐含优化级别的所有其他选项都会发出优化已设置的警告消息。不使用任何优化来编译的唯一方法是从指定优化级别的命令行或 makefile 删除所有选项。
通常,编译程序时使用的优化级别越高,运行时性能也越高。但是,优化级别越高,编译时间会越长,可执行文件也越大。
有五个级别可与 -xOn 一起使用。编译器在每个级别执行的实际优化可能会随各个编译器发行版发生变化。此处只是做了概述。
如果优化器内存不足,则它尝试在较低优化级别上再次进行,即继续在原始级别上对后续例程进行编译。
值:
- -xO1
-
只执行基本局部优化。
- -xO2
-
执行基本局部和全局优化。通常,此级别产生的代码大小是最小的。
- -xO3
-
在函数级别添加全局优化。一般而言,与 -xspace 选项一起使用时,这一级别和 -xO4 通常会使代码大小最小。
- -xO4
-
在同一文件中增加函数的自动内联。一般而言,除非与 -xspace 结合使用,否则 -xO4 会使代码较大。
要控制内联的例程,请参见 -inline。
- -xO5
-
执行最高级别的优化,只适用于占用最大一部分计算机时间的小部分程序。使用编辑时间更长或减少执行时间的程度不是很高的优化算法。如果使用分析反馈执行该级别上的优化,则更容易提高性能。请参见 -xprofile=collect|use。
交互:
如果使用 -g 或 -g0 且优化级别是 -xO3 或更低,编译器会为近乎完全优化提供尽可能多的符号信息。尾部调用优化和后端内联被禁用。
如果使用 -g 或 -g0 且优化级别是 -xO4 或更高,编译器会为完全优化提供尽可能多的符号信息。
使用 -g 进行调试不会抑制 -xOn,但 -xOn 会在某些方面限制 -g。例如,优化选项会降低调试的效用,以致您无法显示 dbx 中的变量,但您仍可使用 dbx where 命令获取符号回溯。有关更多信息,请参见使用 dbx 调试程序。
优化级别低于 -xO3 时,-xinline 选项不起作用。优化级别为 -xO4 时,优化器会决定应该内联哪些函数,而不管是否指定了 -xinline 选项。优化级别为 -xO4 时,编译器还会尝试确定内联哪些函数可以提高性能。如果使用 -xinline 强制内联函数,实际上可能会降低性能。
警告:
如果在 -xO3 或 -xO4 级别上优化多个非常大的过程(一个过程有数千行代码),优化器会需要过多内存。在这些情况下,机器的性能就会降低。
要阻止这种性能降低的情况,请使用 limit 命令限制单个进程可使用的虚拟内存量(请参见 csh(1) 手册页)。例如,将虚拟内存限制为 16 MB:
example% limit datasize 16M
如果它达到 16 MB 的数据空间,该命令会使优化器尝试恢复。
限制不能大于机器总的可用交换空间,而且要足够的小以允许在较大型编译的过程中机器可以正常使用。
数据大小的最佳设置取决于要求的优化程度、真实内存和可用虚拟内存的大小。
要查找实际的交换空间,请键入:swap -1。
要查找实际的真实内存,请键入:dmesg | grep mem。
另请参见:-xldscope、-fast、-xprofile=p、csh(1) 手册页
性能分析器说明了对性能分析器的数据进行不同级别优化的影响。
- -xopenmp[ ={ parallel| noopt| none}]
-
启用通过 OpenMP 指令进行的显式并行化。
下面详述了 -xopenmp 值:
- parallel
-
启用 OpenMP pragma 的识别。-xopenmp=parallel 时的优化级别为 -xO3。如有必要,编译器会将优化级别提高到 -xO3 并发出警告。
此标志还定义处理器宏 _OPENMP。_OPENMP 宏定义为具有十进制值 yyyymm,其中 yyyy 和 mm 是实现所支持的 OpenMP API 版本的年份和月份标示。有关特定发行版的 _OPENMP 宏的值,请参阅《Oracle Solaris Studio OpenMP API 用户指南》。
- noopt
-
启用 OpenMP pragma 的识别。如果优化级别低于 -xO3,则编译器不提升它。如果将优化级别显式设置为低于 -xO3,如同在 CC -xO2 -xopenmp=noopt 中一样,编译器会发出错误。如果没有使用 -xopenmp=noopt 指定优化级别,则会识别 OpenMP Pragma,并相应地对程序进行并行处理,但不进行优化。此标志还定义处理器宏 _OPENMP。
- none
-
不启用对 OpenMP pragma 的识别,不更改程序的优化级别并且不定义任何预处理程序宏。在未指定 -xopenmp 时,这是缺省值。
如果指定了 -xopenmp 但未指定值,编译器将假定 -xopenmp=parallel。如果根本未指定 -xopenmp,编译器将假定 -xopenmp=none。
如果使用 dbx 调试 OpenMP 程序,那么编译时选用 -g -xopenmp=noopt 可以在并行区设置断点并显示变量内容。
在以后的发行版中,-xopenmp 的缺省值可能会更改。可以通过显式指定适当的优化级别来避免警告消息。
使用 OMP_NUM_THREADS 环境变量可指定在运行 OpenMP 程序时要使用的线程数。如果未设置 OMP_NUM_THREADS,用于执行并行区域的线程的缺省数量为计算机上的可用内核数,上限为 32。可以通过以下方法指定不同线程数:设置 OMP_NUM_THREADS 环境变量,或调用 omp_set_num_threads() OpenMP 运行时例程,或者在并行区域指令中使用 num_threads 子句。为了获得最佳性能,用于执行并行区域的线程数不应超出计算机上的可用硬件线程(或虚拟处理器)数量。在 Oracle Solaris 系统上,可以使用 psrinfo (1M) 命令确定此数量。在 Linux 系统上,可以检查 /proc/cpuinfo 文件来确定此数量。有关更多信息,请参见 OpenMP API 用户指南。
缺省情况下,禁用嵌套并行操作。要启用嵌套并行操作,必须将 OMP_NESTED 环境变量设置为 TRUE。有关详细信息,请参见 OpenMP API 用户指南。
如果在不同的步骤中进行编译和链接,请在编译步骤和链接步骤中都指定 -xopenmp。与链接步骤配合使用时,-xopenmp 选项将与 OpenMP 运行时支持库 libmtsk.so 链接。
为了获得最新功能和性能,请确保系统上安装了 OpenMP 运行时库 libmtsk.so 的最新修补程序。
有关用于生成多线程应用程序的 OpenMP Fortran 95、C 和 C++ 应用程序接口 (application program interface, API) 的更多信息,请参见《Oracle Solaris Studio OpenMP API 用户指南》。
- -xpagesize= n
-
设置堆栈和堆的首选页面大小。
n 值必须是以下项之一:
在 SPARC 上:4K、8K、64K、512K、2M、4M、32M、256M、2G、16G 或 default。
在 x86/x64 上:4K、2M、4M、1G 或 default。
必须指定适于目标平台的有效页面大小。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
使用 pagesize (1) Oracle Solaris 命令可以确定页面中的字节数。操作系统不保证支持页面大小请求。但是,可以使用适当段对齐来增加获取请求的页面大小的可能性。有关如何设置段对齐,请参见 -xsegment_align 选项。可以使用 pmap (1) 或 meminfo (2) 来确定目标平台的页面大小。
除非在编译和链接时使用,否则 -xpagesize 选项不会生效。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C++ 用户指南。
如果指定 -xpagesize=default,Oracle Solaris 操作系统将设置页面大小。
此选项是用于 -xpagesize_heap 和 -xpagesize_stack 的宏。这两个选项与 -xpagesize 接受相同的参数。可以通过指定 -xpagesize=n 来为二者设置相同的值,或分别为它们指定不同的值。
使用该选项进行编译与使用等效的选项将 LD_PRELOAD 环境变量设置为 mpss.so.1,或在运行程序之前使用等效的选项运行 Oracle Solaris 命令 ppgsz(1) 具有相同的效果。有关详细信息,请参见 Oracle Solaris 手册页。
- -xpagesize_heap= n
-
为堆设置内存中的页面大小。
n 值与 -xpagesize 相同。
必须指定适于目标平台的有效页面大小。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
有关详细信息,请参见 -xpagesize。
- -xpagesize_stack= n
-
为堆栈设置内存中的页面大小。
n 值与 -xpagesize 相同。
必须为目标平台上的 Oracle Solaris 操作系统指定有效的页面大小。如果不指定有效的页面大小,运行时将忽略该请求,且不显示任何提示。
有关详细信息,请参见 -xpagesize。
- -xpatchpadding[ ={ fix| patch| size}]
-
在各个函数启动之前保留内存区域。如果指定了 fix,编译器将保留 fix 所需的空间量并继续。这是缺省值。如果指定了 patch 或未指定任何值,则编译器将保留特定于平台的缺省值。值 -xpatchpadding=0 表示保留 0 字节的空间。在 x86 上 size 的最大值是 127 字节,在 SPARC 上是 2048 字节。
- -xpch= v
-
该编译器选项可激活预编译头文件功能。v 可以使 auto、autofirst、collect:pch_filename 或 use:pch_filename。要使用该功能,需要指定 -xpch 和 -xpchstop 选项,并使用 #pragma hdrstop 指令。
使用 -xpch 选项可以创建预编译头文件并减少编译时间。预编译头文件目的在于减少源文件共享一组通用的包含文件(包含大量源代码)的应用程序的编译时间。预编译头文件的工作机理是,首先从一个源文件收集一组头文件信息,然后在重新编译该源文件或者编译其他有同样头文件顺序的源文件时就可以使用这些收集到的信息。
您可以允许编译器为您自动生成预编译头文件。可以选择以下两种方式之一来执行该操作。一种方法是让编译器从在源文件找到的第一个包含文件创建预编译头文件。另一种方法是让编译器从在源文件中找到的包含文件集合中选择,选择范围从第一个包含文件开始,直到已经定义好的确定哪个包含文件是最后一个的点结束。使用以下两个标志之一可以确定编译器用于自动生成预编译头文件的方法:
- -xpch=auto
-
预编译头文件的内容基于编译器在源文件中找到的最长活前缀(有关如何识别活前缀的说明,请参见下面的部分)。此标志生成的预编译头文件可能包含最多的头文件。
- -xpch=autofirst
-
此标志生成的预编译头文件仅包含在源文件中找到的第一个头文件。
如果决定手动创建预编译头文件,必须首先使用 -xpch,并指定 collect 模式。指定 -xpch=collect 的编译命令只能指定一个源文件。在以下示例中,-xpch 选项根据源文件 a.cc 创建名为 header.Cpch 的预编译头文件:
CC -xpch=collect:myheader a.cc
有效的预编译头文件名总是有后缀 .Cpch。在指定 pch_filename 时,您可以自己添加后缀,也可以让编译器为您添加。例如,如果指定 CC -xpch=collect:foo a.cc,则预编译头文件称为 foo.Cpch。
编译器使用以下规则确定如何处理现有的预编译头文件。
如果编译器发现了现有预编译头文件,仅在以下文件属性与当前编译派生的相同信息匹配时,编译器才会使用该文件。
- 活前缀匹配。
- 命令行选项完全相同。
- 当前工作目录相同。
- 源目录路径名相同。
- 编译器和预编译头文件版本号匹配。
活前缀必须满足下列条件才是匹配项:
- #include 文件名全部相同。
- 所有 #define 和 #undef 指令引用相同的符号和指令,并且以相同的顺序显示。
- 关联的 #define 值都相同。
- 所有存在的 pragma 以其原始顺序显示。
请注意,#ident/#pragma idents 在活前缀中按“原样”传递,且不会检查是否相等。每个源文件的字符串参数通常不同;如果进行检查,将抑制现有预配置头文件的使用。
匹配条件中使用的编译器版本与编译器的 -V 选项返回的版本相同。
您还可以指示编译器使用特定的预编译头。为此,可以指定 -xpch=use:pch_filename。您可以将包含文件同一序列中任意数量的源文件指定为用于创建预编译头文件的源文件。例如,在使用模式下命令可能如下所示:
CC -xpch=use:foo.Cpch foo.cc bar.cc foobar.cc
如果以下条件都成立,则只能使用现有的预编译的头文件。如果以下任一条件不成立,则应重新创建预编译头文件:
- 用于访问预编译头文件的编译器与创建预编译头文件的编译器相同。由某一版本的编译器创建的预编译头文件可能无法供其他版本的编译器使用。
- 除 -xpch 选项之外,用 -xpch=use 指定的编译器选项必须与创建预编译头文件时指定的选项相匹配。
- 用 -xpch=use 指定的包含头文件的集合与创建预编译头文件时指定的头文件集合是相同的。
- 用 -xpch=use 指定的包含头文件的内容与创建预编译头文件时指定的包含头文件的内容是相同的。
- 当前目录(即发生编译并尝试使用给定预编译头文件的目录)与创建预编译头文件所在的目录相同。
- 在用 -xpch=collect 指定的文件中预处理指令(包括 #include 指令)的初始序列,与在用 -xpch=use 指定的文件中预处理指令的序列相同。
要在多个源文件间共享预编译头文件,这些源文件必须共享一组共同的包含文件(按其初始标记序列)。标记是指关键字、名称或标点符号。被 #if 指令排除的注释和代码不能被编译器识别为标记。该初始标记序列称为活前缀。也就是说,活前缀是源文件中通用于所有源文件的最靠前的部分。创建预编译头文件并进而确定源文件中哪些头文件是预编译的时,编译器使用此活前缀作为整个操作的依据。
编译器在当前编译期间找到的活前缀必须与用于创建预编译头文件的活前缀匹配。也就是说,编译器必须在使用相同预编译头文件的所有源文件中对活前缀给出一致的解释。
活前缀包括以下任何预处理程序指令:
- #include
- #if/ifdef/ifndef/else/elif/endif
- #define/undef
- #ident
- #pragma
以上任何指令都可以引用宏。#else、#elif 和 #endif 指令必须在活前缀内匹配。注释被忽略。
指定 -xpch=auto 或 -xpch=autofirst 时,编译器会自动确定活前缀的终点,定义如下。对于 -xpch=collect 或 -xpch=use,活前缀以 #pragma hdrstop 结尾。
- 第一个声明/定义语句
- 第一个 #line 指令
- #pragma hdrstop 指令
- 在指定的包含文件之后(如果您指定 -xpch=auto 和 -xpchstop)
- 第一个包含文件(如果您指定 -xpch=autofirst)
注意:条件语句中的终点会生成一个警告,并禁止自动创建预编译头文件。另外,如果同时指定 #pragma hdrstop 和 -xpchstop 选项,编译器将使用两个停止点中较早的那一个来终止活前缀。
在共享预编译头文件的每个文件的活前缀中,每个相应的 #define 和 #undef 指令都必须引用相同的符号(对于 #define,每个都必须引用相同的值)。这些指令在每个活前缀中出现的顺序也必须相同。每个相应 pragma 也必须相同,并且必须按相同顺序出现在共享预编译头文件的所有文件中。
当头文件在不同的源文件之间解释一致时,它可预编译。具体来说,当它仅包含完整的声明时。也就是说,任何一个文件中的声明都必须独自成为有效声明。不完全的类型声明,例如 struct S;,是有效声明。完全类型声明可以出现在某些其他文件中。请考虑这些头文件示例:
file a.h struct S { #include "x.h" /* not allowed */ }; file b.h struct T; // ok, complete declaration struct S { int i; [end of file, continued in another file] /* not allowed */ file c.h namespace N { int foo(); [end of file, continued in another file] /* not allowed */ file d.h extern "C" { int foo(); [end of file, continued in another file] /* not allowed */ file e.h namespace N { int foo(); } /* OK, a stand-alone namespace declaration */ file f.h namespace N { int bar(); } /* OK, namespace re-opened, but still stand- alone */
并入预编译头文件的头文件不得违反以下约束。这里没有定义对违反上述约束的程序的编译结果。
- 头文件不得使用 __DATE__ 和 __TIME__。
- 头文件不得包含 #pragma hdrstop。
编译器自动创建预编译头文件时,会将该文件写入SunWS_cache目录中。此目录始终位于创建对象文件的位置。该文件的更新受锁保护,这样可在 dmake 下正常工作。
如果需要强制编译器重新生成自动生成的预编译头文件,可以使用 CCadmin 工具清除 PCH 高速缓存目录。有关更多信息,请参见 CCadmin(1) 手册页。
指定 -xpch=collect 时,编译器会生成预编译头文件的依赖性信息。需要在 make 文件中创建适当的规则,以利用这些依赖性。考虑下面的 make 文件样例:
%.o : %.cc shared.Cpch $(CC) -xpch=use:shared -xpchstop=foo.h -c $< default : a.out foo.o + shared.Cpch : foo.cc $(CC) -xpch=collect:shared -xpchstop=foo.h foo.cc -c a.out : foo.o bar.o foobar.o $(CC) foo.o bar.o foobar.o clean : rm -f *.o shared.Cpch .make.state a.out
这些 make 规则以及编译器生成的依赖性,会在与 -xpch=collect 一起使用的任何源文件或属于预编译头文件的一部分的任何头文件发生更改时,强制重新创建手动创建的预编译头文件。此约束可防止使用过期的预编译头文件。
对于 -xpch=auto 或 -xpch=autofirst,无需在 makefile 中创建任何其他 make 规则。
警告:
不要在命令行上指定冲突的 -xpch 标志。例如,同时指定 -xpch=collect 和 -xpch=auto 或同时指定 -xpch=autofirst 和 -xpchstop=<include> 会产生错误。
如果指定 -xpch=autofirst,或指定不带 -xpchstop 的 -xpch=auto,则出现在第一个包含文件之前或出现在使用用于 -xpch=auto 的 -xpchstop 指定的包含文件之前的任何声明、定义或 #line 指令都会生成警告,并禁止自动生成预编译头文件。
-xpch=autofirst 或 -xpch=auto 时的第一个包含文件之前的 #pragma hdrstop 会禁止自动生成预编译头文件。
另请参见:-xpchstop
- -xpchstop= file
-
file 是创建预编译头文件时要考虑的最后一个包含文件。在命令行上使用 -xpchstop 与将 hdrstop pragma 置于第一个(引用使用 cc 命令指定的每个源文件中的 file 的)包含指令之后等效。
结合使用 -xpchstop=<include> 和 -xpch=auto 可以创建基于从其往上并包括 <include> 的头文件的预编译头文件。此标志覆盖缺省的 -xpch=auto 行为(使用整个活前缀中包含的所有头文件的行为)。
另请参见:-xpch
- -xpec[ ={ yes| no}]
-
(Oracle Solaris) 生成可移植的可执行代码 (Portable Executable Code, PEC) 二进制文件。此选项将程序中间表示置于对象文件和二进制文件中。该二进制文件可在以后用于调整和故障排除。
使用 -xpec 生成的二进制文件通常会比未使用 -xpec 生成的二进制文件大五到十倍。
如果未指定 -xpec,编译器会将其设置为 -xpec=no。如果您指定 -xpec,但不提供标志,则编译器会将其设置为 -xpec=yes。
- -xpg
-
编译以便使用 gprof 分析器进行分析。
-xpg 选项可编译自分析代码,以便收集可使用 gprof 分析的数据。该选项调用运行时记录机制,该机制会在程序正常终止时生成 gmon.out 文件。
注意:如果指定了 -xpg,则 -xprofile 并无优势。两者不能准备或使用对方提供的数据。
使用 prof 或 gprof(在 64 位 Oracle Solaris 平台上)或者仅使用 gprof(在 32 位 Solaris 平台上)生成的分析中包括大致的用户 CPU 时间。这些时间来自主可执行文件中的例程以及共享库中例程(链接可执行文件时将共享库指定为链接程序参数)的 PC 样例数据(请参见 pcsample(2))。其他共享库(在进程启动后使用 dlopen(3DL) 打开的库)不进行分析。
在 32 位 Oracle Solaris 系统中,使用 prof(1) 生成的分析仅限于可执行文件中的例程。通过使用 -xpg 链接可执行文件并使用 gprof(1),可以对 32 位共享库进行分析。
Solaris 10 软件不包括使用 -p 编译的系统库。因此,在 Solaris 10 平台上收集的分析不包含系统库例程的调用计数。
也可以使用性能分析器执行此任务。请参阅 analyzer(1) 手册页。
警告:
如果在编译时指定 -xpg,则还必须在链接时指定它。有关在编译时和链接时都必须指定的选项的完整列表,请参见 C++ 用户指南。
注意:使用 -xpg 编译以便进行 gprof 分析的二进制文件不应与 binopt(1) 一起使用,因为它们不兼容并可能导致内部错误。
注意:在 x86 系统上,-xpg 与 -xregs=frameptr 不兼容,因为 gprof 运行时库需要有效的帧指针来确定分析的例程的返回地址。另请注意,在 x86 系统上使用 -fast 进行编译将调用 -xregs=frameptr。请改用以下命令进行编译:
-fast -xregs=no%frameptr -xpg
- -xport64[ = v]
-
使用此选项可帮助您将代码移植到 64 位环境。具体来说,该选项会针对遇到的问题发出警告,例如:类型(包括指针)的截断,符号扩展以及位包装更改;将代码从 32 位体系结构移植到 64 位体系结构时经常会遇到这些问题。
除非您也在 64 位模式 (-m64) 下进行编译,否则此选项没有任何效果。(在 64 位 Linux 系统上,-m64 为缺省值。)
值:
v 必须为以下值之一。
- no
-
将代码从 32 位环境移植到 64 位环境时,不会生成与该代码移植有关的任何警告。
- implicit
-
只生成隐式转换的警告。显式强制类型转换出现时不生成警告。
- full
-
将代码从 32 位环境移植到 64 位环境时,生成了与该代码移植有关的所有警告。其中包括对 64 位值的截断警告、根据 ISO 值的保存规则对 64 位的符号扩展,以及对位字段包装的更改。
缺省值:
如果未指定 -xport64,则缺省值为 -xport64=no。如果指定了 -xport64,但未指定标志,则缺省值为 -xport64=full。
另请参见:-xarch、-m32|-m64
- -xprefetch[ = a[, a]]
-
在支持预取的体系结构上启用并调整预取指令。必须使用该选项在优化级别 3 或更高级别进行编译。
a 必须为以下值之一。
- auto
-
启用预取指令的自动生成。
- no%auto
-
禁用自动生成。
- explicit
-
启用显式预取宏。
显式预取只应在度量支持的特殊环境下使用。
- no%explicit
-
禁用显式预取宏。
- latx: factor
-
(SPARC) 只能将此标志与 -xprefetch=auto 结合使用。根据指定的因子,调整编译器假定的“预取到装入”和“预取到存储”延迟。该因子必须是正浮点数或整数。
- yes
-
(已过时)改用 -xprefetch=auto,explicit。
- no
-
(已过时)改用 -xprefetch=no%auto,no%explicit。
使用 -xprefetch 和 -xprefetch=auto 时,编译器就可以将预取指令自由插入到它生成的代码中。该操作会提高支持预取的体系结构的性能。
如果要在较大的多处理器上运行需要大量计算的代码,您会发现使用 -xprefetch=latx:factor 有很多优点。该选项指示代码生成器按照指定的因子调节在预取及其相关的装入或存储之间的缺省延迟时间。
预取延迟是从执行预取指令到所预取的数据在高速缓存中可用那一刻之间的硬件延迟。在确定发出预取指令到发出使用所预取数据的装入或存储指令之间的间隔时,编译器就采用预取延迟值。
注意:在预取和装入之间采用的延迟可能与在预取和存储之间采用的延迟不同。
编译器可以在众多计算机与应用程序间调整预取机制,以获得最佳性能。这种调整并非总能达到最优。对于占用大量内存的应用程序,尤其是要在大型多处理器上运行的应用程序,可以通过增加预取延迟值来提高性能。要增加值,请使用大于 1 的因子。介于 .5 和 2.0 之间的值最有可能提供最佳性能。
对于数据集完全位于外部高速缓存中的应用程序,可以通过减小预取延迟值来提高性能。要减小值,请使用小于 1 的因子。
要使用 -xprefetch=latx:factor 选项,请首先使用接近 1.0 的因子值并对应用程序运行性能测试。然后适当增加或减小该因子,并再次运行性能测试。继续调整因子并运行性能测试,直到获得最佳性能。以很小的增量逐渐增加或减小因子时,前几步中不会看到性能差异,之后会突然出现差异,然后再趋于稳定。
缺省值:
缺省值为 -xprefetch=auto,explicit。
如果使用 -xprefetch 或 -xprefetch=auto 等启用了自动预取,但未指定延迟因子,则假定 latx:1.0。
交互:
该选项会累积而不覆盖。
sun_prefetch.h 头文件提供了用于指定显式预取指令的宏。这些预取可能位于对应于宏出现位置的可执行文件中。
要使用显式预取指令,必须在适当的体系结构上,将 sun_prefetch.h 包含进来,并且从编译器命令中排除 -xprefetch 或者使用 -xprefetch、-xprefetch=auto,explict、-xprefetch=explicit。
如果调用宏并包含 sun_prefetch.h 头文件,但传递 -xprefetch=no%explicit,那么显式预取将不会出现在可执行文件中。
-xchip 设置影响假定延迟的决定以及 latx:factor 设置的结果。
仅当启用了自动预取时,latx:factor 子选项才有效。也就是说,除非与 yes 或 auto 选项一起使用,否则 latx:factor 选项会被忽略。
警告:
因为编译器可以在众多计算机与应用程序间调整预取机制以获得最佳性能,所以当性能测试指示性能明显提高时,应当只使用 latx:factor 子选项。假定的预取延迟在不同发行版本中是不同的。因此,无论何时切换到不同的发行版本,强烈建议重新测试延迟因子对性能的影响。
- -xprefetch_auto_type=[ a]
-
a 是 [no%]indirect_array_access。
使用此选项可以确定编译器是否以为直接内存访问生成预取的方式,为由选项 -xprefetch_level 指示的循环生成间接预取。
前缀 no% 可禁用该选项。
如果不指定 -xprefetch_auto_type 的设置,编译器会将其设置为 -xprefetch_auto_type=no%indirect_array_access。
类似 -xalias_level 的选项可以影响计算候选间接预取的主动性,进而影响因更好的内存别名歧义消除信息而发生的自动插入间接预取的主动性。
- -xprefetch_level= l
-
控制使用 -xprefetch=auto 确定的预取指令的自动插入。指定了 -xprefetch=auto 时,缺省值为 -xprefetch_level=1。
l 必须为 1、2 或 3。
在早期的 SPARC 和 x86 平台上,预取级别 2 和 3 可能不会生效。
-xprefetch_level=1 会启用预取指令的自动生成。-xprefetch_level=2 以级别 1 目标之外的额外循环为目标。-xprefetch=3 以级别 2 目标之外的额外循环为目标。
必须在优化级别 3 或更高级别进行编译,并为支持预取的平台生成代码。
- -xprevise={ yes| no}
-
使用该选项编译可生成能使用代码分析器查看的源代码静态分析。
使用 -xprevise=yes 进行编译并在单独的步骤中进行链接时,还需要在链接步骤中包括 -xprevise=yes。
缺省值为 -xprevise=no。
在 Linux 上,需要指定 -xprevise=yes 和 -xannotate。
有关详细信息,请参见 Oracle Solaris Studio 代码分析器文档。
- -xprofile= p
-
收集用于分析的数据或使用分析进行优化。
p 必须为 collect[:profdir]、use[:profdir] 或 tcov[:profdir]。
此选项可在执行期间收集并保存执行频率数据,然后在后续运行中可以使用该数据来改进性能。对多线程应用程序来讲,分析收集 (Profile collection) 是一种安全的方法。也就是说,对执行其自己的多任务处理 (-mt) 的程序进行分析可产生准确的结果。只有指定 -xO2 或更高的优化级别时,此选项才有效。
如果分别执行编译和链接,则编译步骤和链接步骤中必须都出现同一 -xprofile 选项。有关在编译时和链接时都必须指定的选项的完整列表,请参见 C++ 用户指南。
- collect[: profdir]
-
在 -xprofile=use 时优化器收集并保存执行频率,以供将来使用。编译器生成可测量语句执行频率的代码。
-xMerge、-ztext 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
分析目录名 profdir(如果指定)是包含已分析的对象代码的程序或共享库在执行时用来存储分析数据的目录路径名。如果路径名不是绝对路径,在使用选项 -xprofile=use:profdir 编译程序时将相对于当前工作目录来解释该路径。
如果未使用 -xprofile=collect:prof_dir 或 -xprofile=tcov:prof_dir 指定任何分析目录名,则分析数据在运行时将存储在名为 program.profile 的目录中,其中程序是已分析进程的主程序的基名。在这种情况下,可以使用环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 控制在运行时存储分析数据的位置。如果已设置,分析数据将写入由 $SUN_PROFDATA_DIR/$SUN_PROFDATA 指定的目录中。
如果在编译时指定了分析目录名,则 SUN_PROFDATA_DIR 和 SUN_PROFDATA 在运行时不起任何作用。这些环境变量同样控制由 tcov 写入的分析数据文件的路径和名称,如 tcov(1) 手册页中所述。
如果未设置这些环境变量,分析数据将写入当前目录中的目录 profdir.profile,其中 profdir 是可执行文件的名称或在 -xprofile=collect:profdir 标志中指定的名称。如果 profdir 已经以 .profile 结尾,则 -xprofile 不会将 .profile 附加到 profdir。如果多次运行程序,那么执行频率数据会累积在 profdir.profile 目录中;也就是说,以前执行的输出不会丢失。
示例 [1]:在目录 myprof.profile(位于生成程序所在的目录中)中收集分析数据,并使用这些分析数据:
CC -xprofile=collect:myprof.profile -xO5 prog.cc -o prog https://docs.oracle.com/cd/E57201_01/html/E57229/prog CC -xprofile=use:myprof.profile -xO5 prog.cc -o prog
示例 [2]:在目录 /bench/myprof.profile 中收集分析数据,然后在优化级别为 -xO5 的反馈编译中使用收集的分析数据:
CC -xprofile=collect:/bench/myprof.profile -xO5 prog.cc -o prog ...run prog from multiple locations... CC -xprofile=use:/bench/myprof.profile -xO5 prog.cc -o prog
如果在不同的步骤中进行编译和链接,应确保使用 -xprofile=collect 编译的任何对象文件也使用 -xprofile=collect 进行链接。有关在编译时和链接时都必须指定的编译器选项的完整列表,请参见 C 用户指南。
有关控制异步分析收集的环境变量的描述,另请参见本手册页下文的“环境变量”部分。
- use[: profdir]
-
使用从通过 -xprofile=collect[:profdir] 或 -xprofile=tcov[:profdir] 编译的代码中收集的执行频率数据针对在执行已分析代码时执行的工作进行优化。profdir 是包含通过运行使用 -xprofile=collect[:profdir] 或 -xprofile=tcov[:profdir] 编译的程序收集的分析数据的目录的路径名。
要生成 tcov 和 -xprofile=use[:profdir] 都能使用的数据,必须在编译时使用选项 -xprofile=tcov[:profdir] 指定相同的分析目录。为最大限度地减少混淆情况,请将 profdir 指定为绝对路径名。
profdir 是可选的。如果未指定 profdir,将使用可执行二进制文件的名称。如果未指定 -o,将使用 a.out。如果未指定 profdir,编译器将查找 profdir.profile/feedback 或 a.out.profile/feedback。例如:
CC -xprofile=collect -o myexe prog.c CC -xprofile=use:myexe -xO5 -o myexe prog.c
程序是使用以前生成并保存在 feedback 文件中的执行频率数据优化的,此数据是先前执行用 -xprofile=collect 编译的程序时写入的。
除了 -xprofile 选项之外,源文件和其他编译器选项必须与用于编译(该编译过程创建了随后生成 feedback 文件的编译程序)的相应选项完全相同。编译器的相同版本必须同时用于collect生成和use生成。
如果用 -xprofile=collect:profdir 编译,则必须将相同的分析目录名 profdir 用在优化编译中:-xprofile=use: profdir。
另请参见 -xprofile_ircache,以了解有关加速 collect 阶段和 use 阶段之间的编译的说明。
- tcov[ : profdir]
-
使用 tcov(1) 检测对象文件以进行基本块覆盖分析。
如果指定了可选的 :profdir 参数,则编译器将在指定位置创建分析目录。分析目录中存储的数据可通过 tcov(1) 或设置了 -xprofile=use:profdir 的编译器使用。
如果省略可选的 :profdir 参数,执行已进行分析的程序时将创建分析目录。只能通过 tcov (1) 使用该分析目录中存储的数据。使用环境变量 SUN_PROFDATA 和 SUN_PROFDATA_DIR 可以控制分析目录的位置。请参见下文的“环境变量”部分。
如果 :profdir 指定的位置不是绝对路径名,则在编译程序时会相对于当前工作目录来解释该位置。
如果为任何对象文件指定了 :profdir,则必须为同一程序中的所有对象文件指定同一位置。由 :profdir 指定位置的目录必须在要执行已进行分析的程序的所有计算机中都可以访问。除非不再需要分析目录中的内容,否则不应删除该目录,因为除非重新编译,否则编译器存储在其中的数据将无法恢复。
示例 1:如果用 -xprofile=tcov:/test/profdata 编译一个或多个程序的对象文件,编译器会创建一个名为 /test/profdata.profile 的目录并将其用来存储描述已分析的对象文件的数据。该同一目录还可在执行时用来存储与已进行分析的对象文件关联的执行数据。
示例 2:如果名为 "myprog" 的程序用 -xprofile=tcov 编译并在目录 /home/joe, 中执行,将在运行时创建目录 /home/joe/myprog.profile 并将其用来存储运行时分析数据。
- -xprofile_ircache[ = path]
-
在使用阶段,将 -xprofile_ircache[=path] 与 -xprofile=collect|use 一起使用会重用收集阶段保存的编译数据,从而可以减少编译时间。
在编译大程序时,由于中间数据的保存,使得use阶段的编译时间大大减少。注意,所保存的数据会占用相当大的磁盘空间。
在使用 -xprofile_ircache[=path] 时,path 会覆盖保存缓存文件的位置。缺省情况下,这些文件会作为对象文件保存在同一目录下。当收集阶段和使用阶段出现在两个不同的目录时,指定路径便十分有用。
以下是典型的命令序列:
example% CC -xO5 -xprofile=collect -xprofile_ircache t1.cc t2.cc example% a.out // run collects feedback data example% CC -xO5 -xprofile=use -xprofile_ircache t1.cc t2.cc
- -xprofile_pathmap= collect _ prefix : use _ prefix
-
当同时指定了 -xprofile=use 命令时,请使用 -xprofile_pathmap 选项。以下两个条件都成立且编译器无法找到使用 -xprofile=use 编译的对象文件的分析数据时,使用 -xprofile_pathmap。
- 使用 -xprofile=use 编译目标文件所在的目录与先前使用 -xprofile=collect 编译目标文件所在的目录不同。
- 目标文件在分析中共享公共基名,但可以根据它们在不同目录中的位置互相区分。
collect-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的对象文件是使用 -xprofile=collect 编译的。
use-prefix 是目录树的 UNIX 路径名的前缀,该目录树中的对象文件是使用 -xprofile=use 编译的。
如果指定了 -xprofile_pathmap 的多个实例,编译器将按照这些实例的出现顺序对其进行处理。将 -xprofile_pathmap 实例指定的每个 use-prefix 与对象文件路径名进行比较,直至找到匹配的 use-prefix 或发现最后一个指定的 use-prefix 与对象文件路径名也不匹配。
- -xreduction
-
对自动并行化中的约简进行循环分析。只有在同时指定了 -xautopar 时,此选项才有效。否则,编译器会发出警告。
当启用了约简识别时,编译器会并行化约简,例如 dot 积、最大与最小查找。这些约简产生的舍入与通过非并行化代码获得的舍入不同。
- -xregs= r[, r...]
-
为生成的代码指定寄存器用法。
r 是一个逗号分隔列表,它包含下面的一个或多个子选项:appl、float、frameptr。
用 no% 作为子选项的前缀会禁用该子选项。
示例:-xregs=appl,no%float
请注意,-xregs 子选项仅限于特定的硬件平台。
- appl (SPARC)
-
允许编译器将应用程序寄存器用作临时寄存器来生成代码。应用程序寄存器是:
- g2、g3 或 g4(在 32 位平台上)
- g2 或 g3(在 64 位平台上)
强烈建议使用 -xregs=no%appl 编译所有系统软件和库。系统软件(包括共享库)必须为应用程序保留这些寄存器值。这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致。
在 SPARC ABI 中,这些寄存器表示为应用程序寄存器。由于需要更少的装入和存储指令,因此使用这些寄存器可提高性能。但是,这样使用可能与某些用汇编代码编写的旧库程序冲突。
有关 SPARC 指令集的更多信息,请参见 -xarch。
- float (SPARC)
-
允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码。无论此选项如何,浮点值都可以使用这些寄存器。要生成对浮点寄存器没有任何引用的二进制代码,请使用 -xregs=no%float 并确保源代码未以任何方式使用浮点类型。
- float (x86)
-
允许编译器通过将浮点寄存器用作临时寄存器来生成代码。无论此选项如何,浮点值都可以使用这些寄存器。要生成对浮点寄存器没有任何引用的二进制代码,请使用 -xregs=no%float 并确保源代码未以任何方式使用浮点类型。在代码生成期间,编译器将尝试诊断导致使用浮点、simd 或 x87 指令的代码。
- frameptr (x86)
-
允许编译器将帧指针寄存器(在 IA32 上为 %ebp,在 x86 64 位平台上为 %rbp)用作通用寄存器。
缺省值为 -xregs=no%frameptr。
除非也用 -features=no%except 禁用了异常,否则 C++ 编译器将忽略 -xregs=frameptr。另请注意,-xregs=frameptr 是 -fast 的一部分,但除非同时指定 -features=no%except,否则 C++ 编译器将忽略此设置。
通过 -xregs=frameptr,编译器可以自由使用帧指针寄存器来改进程序性能。但是,这可能会限制调试器和性能测量工具的某些功能。堆栈跟踪、调试器和性能分析器不能对通过 -xregs=frameptr 编译的函数生成报告。
此外,对 Posix pthread_cancel() 的 C++ 调用将无法尝试查找清除处理程序。
如果直接调用或从 C 或 Fortran 函数间接调用的 C++ 函数会引发异常,不应该用 -xregs=frameptr 编译 C、Fortran 和 C++ 混合代码。如果使用 -fast 编译此类混合源代码,请在命令行中的 -fast 选项后添加 -xregs=no%frameptr。
由于 64 位平台上的可用寄存器更多,因此与 64 位代码相比,使用 -xregs=frameptr 编译更容易改进 32 位代码的性能。
注意:如果同时指定了 -xpg,编译器会忽略 -xregs=frameptr 并发出警告。而且,-xkeepframe 优先于 -xregs=frameptr。
SPARC 缺省值为 -xregs=appl,float。x86 缺省值为 -xregs=no%frameptr,float。在 x86 上 -xregs=frameptr 包含在 -fast 的扩展中。
强烈推荐您用 -xregs=no%appl,float 编译那些用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道这些寄存器分配。
例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要确切地知道其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。
- -xrestrict[ = f]
-
将赋值为指针的函数参数视为受限指针。f 是 %all、%none、%source 或者一个或多个函数名称的逗号分隔列表。该命令行选项可单独使用,但是最好与 -xO3 或更高级别的优化一起使用。
如果指定 -xrestrict=%source,表示将限制在主要源文件(而不是任何头文件或模板定义文件)中定义的所有函数。
如果使用此选项指定函数列表,则指定的函数中的指针参数将被视为限定的;如果指定 -xrestrict=%all,整个 C++ 文件中的所有指针参数均被视为限定的。
缺省值为 %none。指定 -xrestrict 与指定 -xrestrict=%source 等效。
另请参见:-xprefetch_auto_type 以及 C++ 用户指南中的“受限指针”。
- -xs[ ={ yes| no}]
-
(Oracle Solaris) 将调试信息从对象文件链接到可执行文件。
-xs 与 -xs=yes 相同。-xdebugformat=dwarf 的缺省值与 -xs=yes 相同。-xdebugformat=stabs 的缺省值与 -xs=no 相同。
该选项控制可执行文件大小与为了调试而需要保留对象文件之间的权衡。对于 dwarf,请使用 -xs=no 使可执行文件保持较小但依赖于对象文件。对于 stabs,请使用 -xs 或 -xs=yes 以较大的可执行文件为代价避免对对象文件的依赖。该选项对程序的 dbx 性能或运行时性能几乎没有影响。
当编译命令强制链接时(即未指定 -c),没有对象文件和调试信息必须放置在可执行文件中。在这种情况下,将忽略 -xs=no(隐式或显式)。
该功能的实施方法是让编译器调整发出的对象文件中的节标志和/或节名称,然后告知链接程序对该对象文件的调试信息执行什么操作。因此它是一个编译器选项,而非链接程序选项。可以使一个可执行文件的某些对象文件使用 -xs=yes 进行编译,而其他对象文件使用 -xs=no 进行编译。
Linux 编译器接受但是忽略 -xs。Linux 编译器不接受 -xs={yes|no}。
- -xsafe=mem
-
(SPARC)允许编译器假定未发生违反内存保护的情况。
该选项允许编译器使用 SPARC V9 架构中的无故障装入指令。
警告:
由于在发生诸如地址未对齐或段违规的故障时,无故障装入不会导致陷阱,因此您应该只对不会发生此类故障的程序使用该选项。因为只有很少的程序会导致基于内存的陷阱,所以您可以安全地将该选项用于大多数程序。对于显式依赖基于内存的自陷来处理异常情况的程序,请勿使用该选项。
交互:
仅当与优化级别 -xO5 及以下 -xarch 值中的一个一起使用时,此选项才能有效:sparc、sparcvis、sparcvis2 或 sparcvis3(用于 -m32 和 -m64)。
- -xsegment_align= n
-
(Oracle Solaris) 此选项使驱动程序在链接行上包括特殊映射文件。映射文件将文本、数据和 bss 段对齐到 n 指定的值。使用非常大的页面时,在适当的边界上对齐堆和堆栈段非常重要。如果未对齐这些段,将使用小页面直到下一个边界,这会导致性能下降。映射文件确保在适当边界上对齐段。
n 值必须是以下项之一:
SPARC:以下值有效:8K、64K、512K、2M、4M、32M、256M、1G 和 none。
x86:以下值有效:4K、8K、64K、512K、2M、4M、32M、256M、1G 和 none。
SPARC 和 x86 的缺省值为 none。
建议的用法如下所示:
SPARC 32-bit compilation: -xsegment_align=64K SPARC 64-bit compilation: -xsegment_align=4M x86 32-bit compilation: -xsegment_align=8K x86 64-bit compilation: -xsegment_align=4M
驱动程序将包括相应的映射文件。例如,如果用户指定 -xsegment_align=4M,驱动程序会将 -M install-directory/lib/compilers/mapfiles/map.4M.align 添加到链接行,其中 install-directory 是安装目录。然后,将在 4M 边界上对齐上述段。
- -xspace
-
不允许会增大代码大小的优化。
- -xtarget= t
-
为指令集和优化指定目标系统。
t 必须是下列值之一:native、native64、generic、generic64 或 system-name。
此选项是一个宏。-xtarget 的每个特定值都会扩展到 -xarch、-xchip 和 -xcache 选项的特定值集。有关如何查看 -xtarget 等宏选项的扩展的详细信息,请参见 -dryrun 说明。
注意:-xtarget 在特定主机平台上的扩展在该平台上编译时扩展到的 -xarch、-xchip 或 -xcache 设置可能与 -xtarget=native 不同。
-xtarget=native 与 -m32、-xarch=native、-xchip=native、-xcache=native 等效,可在 32 位主机系统上提供最佳性能。
-xtarget=native64 与 -m64、-xarch=native64、-xchip=native64、-xcache=native 等效,可在 64 位主机系统上提供最佳性能。
-xtarget=generic 与 -m32、-xarch=generic、-xchip=generic、-xcache=generic 等效,可在大多数 32 位系统上提供通用体系结构、芯片和高速缓存的最佳性能。
-xtarget=generic64 与 -m64、-xarch=generic64、-xchip=generic64、-xcache=generic 等效,可在大多数 64 位系统上提供通用体系结构、芯片和高速缓存的最佳性能。
在 SPARC 平台上:
在 64 位 SPARC 体系结构上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果指定带有 native64 或 generic64 之外的标志的 -xtarget,还必须指定 -m64 选项,如下所示:
-xtarget=ultra4 ... -m64
否则,编译器将使用 32 位内存模型。
- platform-name
-
获取指定平台的最佳性能。以下是 platform name 的有效 SPARC 值:ultra、ultra2、ultra2i、ultra1/140、ultra1/170、ultra1/200、ultra2/1170、ultra2/1200、ultra2/1300、ultra2/2170、ultra2/2200、ultra2/2300、ultra2e、ultra2i、ultra3、ultra3cu、ultra3i、ultra4、ultra4plus、ultraT1、ultraT2、ultraT2plus、T3、T4、T5、M5、sparc64vi、sparc64vii、sparc64viiplus、sparc64x、sparc64xplus。
注意:以下 SPARC 平台名称已过时,在将来的发行版中可能会删除:ultra、ultra2、ultra2e、ultra2i、ultra3、ultra3cu、ultra3i、ultra4 和 ultra4plus。
在 x86 平台上:
在 64 位 x86 平台上针对 64 位 Oracle Solaris 软件进行编译是由 -m64 选项指示的。如果指定带有 native64 或 generic64 之外的标志的 -xtarget,还必须指定 -m64 选项,如下所示:
-xtarget=opteron ... -m64
否则,编译器将使用 32 位内存模型。
- processor _ name
-
生成代码以在以下 x86 处理器上获得最佳性能:nehalem、barcelona、opteron、pentium、pentium_pro、pentium3、pentium4、penryn、sandybridge、ivybridge、haswell、westmere、woodcrest。
有关平台和处理器名称的更多信息,请参见 C++ 用户指南。
-xtarget 子选项的实际扩展可能会随各个编译器发行版发生变化和改进。使用 -dryrun 进行编译以查看如下实际扩展:
CC -dryrun -xtarget=ultra4 |& grep command line files and options (expanded): -dryrun -xchip=ultra4 -xcache=64/32/4:8192/128/2 -xarch=sparcvis2
- -xtemp= path
-
等效于 -temp=path。
- -xthreadvar[ = o]
-
与 __thread 声明说明符结合使用,可利用编译器的线程局部存储工具。使用 __thread 声明线程变量后,请使用 -xthreadvar,以便能够将线程局部存储用于动态(共享)库中的位置相关的代码(非 PIC 代码)。有关如何使用 __thread 的更多信息,请参见 C++ 用户指南。
值:
o 可以是以下值之一:
- [no%]dynamic
-
编译动态装入的变量。前缀 no% 可禁用该选项。使用 -xthreadvar=no%dynamic 时对线程变量的访问明显加快,但是不能在动态库中使用对象文件。也就是说,只能在可执行文件中使用对象文件。
缺省值:
如果未指定 -xthreadvar,则编译器所用的缺省设置取决于是否启用与位置无关的代码。如果启用了与位置无关的代码,则该选项设置为 -xthreadvar=dynamic。如果禁用了与位置无关的代码,则该选项设置为 -xthreadvar=no%dynamic。
如果指定了 -xthreadvar 但未指定任何参数,则该选项设置为 -xthreadvar=dynamic。
交互:
使用 __thread 的对象必须使用 -mt 进行编译和链接。
警告:
如果动态库包含与位置有关的代码,则必须指定 -xthreadvar。
链接程序不支持在动态库中与非 PIC 代码等效的线程变量。由于非 PIC 线程变量要快很多,所以应将其用作可执行文件的缺省设置。
另请参见:-xcode、-KPIC、-Kpic
- -xthroughput[ ={ yes| no}]
-
-xthroughput 选项可告知编译器当多个进程同时在系统上运行时应用程序将会运行。
如果 -xthroughput=yes,编译器首选这样的优化:会稍微降低单个进程的性能,同时提高系统上所有进程完成的工作量。例如,编译器可能会选择在预取数据时不太主动。这样的选择会减少该进程消耗的内存带宽,由此该进程运行速度可能会减慢,但是也会留出更多内存带宽供其他进程共享。
缺省值为 -xthroughput=no。
- -xtime
-
使 CC 驱动程序报告各个编译传递的执行时间。
- -xtrigraphs[ ={ yes| no}]
-
启用或禁用 ISO/ANSI C 标准定义的三字母序列的识别。
-xtrigraphs=yes 启用源代码中三字母序列的识别。
-xtrigraphs=no 禁用源代码中三字母序列的识别。
缺省值:
如果未指定 -xtrigraphs 选项,则假定 -xtrigraphs=yes。
如果仅指定了 -xtrigraphs,则假定 -xtrigraphs=yes。
- -xunboundsym={ yes| no}
-
指定程序是否包含对动态绑定符号的引用。
-xunboundsym=yes 表示程序包含对动态绑定符号的引用。
-xunboundsym=no 表示程序不包含对动态绑定符号的引用。
缺省值为 -xunboundsym=no。
- -xunroll= n
-
启用在可能的场合下解开循环。
此选项指定编译器是否优化(解开)循环。
n 为 1 时,建议编译器不要解开循环。
n 为大于 1 的整数(-xunroll=n)时,编译器会将循环解开 n 次。
- -xustr={ascii_utf16_ushort| no}
-
此选项使编译器能够识别使用 UTF-16 字符的字符串和文字。因为这样的字符串和文字还不属于任何标准,所以该选项的作用是使非标准 C++ 得以识别。如果需要支持使用 ISO10646 UTF-16 字符的国际化应用程序,请指定 -xustr=ascii_utf16_ushort。换句话说,如果代码中包含您希望在对象文件中由编译器转换成 UTF-16 字符的字符串字符,请使用该选项。如果不指定该选项,编译器既不生成、也无法识别 16 位的字符串。使用该选项时,U"ASCII_string" 文本字符串会识别为无符号短整型数组。此选项还可启用字符文字的识别。例如:unsigned short character = U'Z';
通过指定 -xustr=no,可以关闭编译器识别 U"ASCII_string" 文本字符串。该选项在命令行上最右侧的实例覆盖了先前的所有实例。
缺省值为 -xustr=no。如果指定了没有参数的 -xustr,编译器将不接受该选项,而是发出一个警告。如果 C 或 C++ 标准定义了语法的含义,那么缺省设置是可以更改的。
指定 -xustr=ascii_ustf16_ushort 而不同时指定 U"ASCII_string" 文本字符串不是一个错误。
不是所有文件都必须使用该选项编译。
以下示例显示了前置有 U 的带引号文本字符串。此外,还显示了用于指定 -xustr 的命令行。
example% cat file.cc const unsigned short *foo = U"foo"; const unsigned short bar[] = U"bar"; const unsigned short *fun() { return foo; } example% CC -xustr=ascii_utf16_ushort file.cc -c
8 位字符文字可以带有 U 前缀,以形成一个 unsigned short 类型的 16 位 UTF-16 字符。示例:
const unsigned short x = U'x'; const unsigned short y = U'x79';
- -xvector[ = a]
-
启用向量库调用自动生成,和/或在支持 SIMD(Single Instruction Multiple Data,单指令多数据)的 x86 处理器上启用 SIMD 指令生成。使用此选项时,必须通过指定 -fround=nearest 来使用缺省的舍入模式。
-xvector 选项需要 -O3 或更高的优化级别。如果优化级别未指定或低于 -O3,编译将不会继续,同时会发出消息。
a 可具有以下值(前缀 no% 会禁用子选项):
- [ no%] lib
-
(Oracle Solaris) 允许编译器将循环内的数学库调用转换为对等效向量数学例程的单个调用(如果能够进行此类转换)。此类转换可提高那些循环计数较大的循环的性能。使用 no%lib 可以禁用此选项。
- [ no%] simd
-
(SPARC) 对于 -xarch=sparcace 和 -xarch=sparcaceplus,指示编译器使用浮点和整数 SIMD 指令来提高某些循环的性能。与其他 SPARC 平台的该项相对,-xvector=simd 在指定了任何 -xvector 选项(-xvector=none 和 -xvector=no%simd 除外)的 -xarch=sparcace 和 -xarch=sparcaceplus 下始终有效。此外,对于 -xvector=simd,-O 需要大于 3,否则会被跳过而不显示任何警告。
对于所有其他 -xarch 值,指示编译器使用可视化指令集 [VIS1、VIS2、ViS3 等] SIMD 指令来提高某些循环的性能。从根本上来说,使用显式 -xvector=simd 选项,编译器将执行循环转换,从而允许生成特殊向量化的 SIMD 指令以减少循环迭代数。仅当 -O 大于 3 并且 -xarch 为 sparcvis3 及以上时,-xvector=simd 选项才有效。否则,将跳过 -xvector=simd 而不显示任何警告。
- [ no%] simd
-
(x86) 指示编译器使用本机 x86 SSE SIMD 指令来提高某些循环的性能。在 x86 中,缺省情况下以可产生有利结果的优化级别 3 和更高级别使用流扩展。使用 no%simd 可以禁用该选项。
仅当目标体系结构中存在流扩展(即目标 ISA 至少为 SSE2)时,编译器才会使用 SIMD。例如,可在现代平台中指定 -xtarget=woodcrest、-xarch=generic64、-xarch=sse2、-xarch=sse3 或 -fast 来使用它。如果目标 ISA 没有流扩展,子选项将无效。
- %none
-
完全禁用该选项。
- yes
-
此选项已过时,改为指定 -xvector=lib。
- no
-
此选项已过时,改为指定 -xvector=%none。
在 x86 平台上的缺省值为 -xvector=simd,在 SPARC 平台上的缺省值为 -xvector=%none。如果指定不带子选项的 -xvector,在 x86 Oracle Solaris、SPARC Solaris 和 Linux 平台上,编译器将分别采用 -xvector=simd,lib、-xvector=lib 和 -xvector=simd。
该选项会覆盖之前的实例,所以 -xvector=%none 会撤消之前指定的 -xvector=lib。
在装入步骤中,编译器包含 libmvec 库。
如果使用单独的命令进行编译和链接,应确保在链接 CC 命令中使用相同的 -xvector 选项。
- -xvis[ ={ yes| no}]
-
(SPARC) 当包括 <vis.h> 头文件以生成 VIS 指令或者当使用汇编程序内联代码 (.il)(使用 VIS 指令)时,应使用 -xvis=yes 进行编译。缺省值为 -xvis=no。指定 -xvis 与指定 -xvis=yes 等效。
VIS 指令集是 SPARC V9 指令集的扩展。尽管 UltraSPARC 是 64 位处理器,但在很多情况下数据都限制在 8 位或 16 位范围内,特别是多媒体应用程序中。VIS 指令可以用一条指令处理 4 个 16 位数据,这个特性使得处理诸如图像、线性代数、信号处理、音频、视频以及网络等新媒体的应用程序的性能大大提高。
- -xvpara
-
发出有关可能存在的并行编程相关问题的警告,这些问题可能导致在使用 OpenMP 时出现错误的结果。与 -xopenmp 和 OpenMP API 指令一起使用。
编译器在检测到下列情形时会发出警告。
- 循环是使用 MP 指令并行化的,而这些指令中的不同循环迭代之间存在数据依赖性。
- OpenMP 数据共享属性子句存在问题。例如,声明在 OpenMP 并行区域中的访问可能创建数据争用的变量 "shared",或者声明其在并行区域中的值在并行区域之后使用的变量 "private"。
如果所有并行化指令在处理期间均未出现问题,则不显示警告。
示例:
CC -xopenmp -xvpara any.cc
- -xwe
-
通过返回非零的退出状态,将所有警告转换成错误。
- -Y c, path
-
指定组件 c 的位置的新路径。
如果已指定组件的位置,则组件的新路径名称为 path/component_name。该选项传递给 ld。
值:
c 必须为以下值之一。
- p
-
更改 cpp 的缺省目录。
- 0
-
更改 ccfe 的缺省目录。
- a
-
更改 fbe 的缺省目录。
- 2
-
更改 iropt 的缺省目录。
- c
-
更改 cg (SPARC) 的缺省目录。
- O
-
更改 ipo 的缺省目录。
- k
-
更改 CClink 的缺省目录。
- l
-
更改 ld 的缺省目录。
- f
-
更改 c++filt 的缺省目录。
- m
-
更改 mcs 的缺省目录。
- u
-
更改 ube 的缺省目录 (x86)。
- A
-
指定目录以搜索所有编译器组件。如果在 path 中找不到组件,搜索将转至编译器的安装目录。
- P
-
将路径添加到缺省库搜索路径。将在缺省库搜索路径之前搜索此路径。
- S
-
更改启动目标文件的缺省目录。
交互:
可以在命令行上指定多个 -Y 选项。如果对任何一个组件应用了多个 -Y 选项,则保留最后一个选项。
另请参见:Oracle Solaris《链接程序和库指南》
- -z arg
-
链接编辑器选项。
-xMerge、-ztext 和 -xprofile=collect 不应同时使用。-xMerge 会强制将静态初始化的数据存储到只读存储器中,-ztext 禁止在只读存储器中进行依赖于位置的符号重定位,而 -xprofile=collect 会在可写存储器中生成静态初始化的、依赖于位置的符号重定位。
有关更多信息,请参见 ld(1) 手册页以及 Oracle Solaris《链接程序和库指南》。
编译系统可识别以下 #pragmas:
#pragma align #pragma does_not_read_global_data #pragma does_not_return #pragma does_not_write_global_data #pragma dumpmacros #pragma end_dumpmacros #pragma fini #pragma hdrstop #pragma ident #pragma init #pragma must_have_frame #pragma pack #pragma rarely_called #pragma returns_new_memory #pragma unknown_control_flow #pragma weak #pragma does_not_read_global_data #pragma does_not_write_global_data #pragma no_side_effect
仅适用于 SPARC:
#pragma no_side_effect
有关这些 pragma 的更多信息,请参阅 C++ 用户指南。
- SUN_PROFDATA= profdir
-
如果已设置,会在使用 -xprofile=collect 编译的程序执行时将从中收集的分析数据存储在当前工作目录中名为 profdir 的目录中。如果编译时在 -xprofile=collect[:profdir] 中指定了可选参数 :profdir,则 SUN_PROFDATA 没有任何作用。
- SUN_PROFDATA_DIR= dirname
-
如果已设置,会将从使用 -xprofile=collect 编译的程序中收集的分析数据存储在 UNIX 目录名为 dirname 的目录中。如果 dirname 不是绝对位置,则在程序执行时会相对于当前工作目录来解释该位置。如果编译时在 -xprofile=collect[:profdir] 中指定了可选参数 :profdir,则 SUN_PROFDATA_DIR 没有任何作用。
- SUN_PROFDATA_REPLACE={ objfile,program,all}
-
SUN_PROFDATA_REPLACE 表示在运行时检测到对象文件的更改版本时,要重置的分析数据范围。使用 SUN_PROFDATA_REPLACE 可确保分析数据与指定程序单元范围内分析的程序保持一致。
SUN_PROFDATA_REPLACE 的值及其含义如下所示:
- objfile
-
重置已更改对象文件的分析数据。
- program
-
重置包含已更改对象文件的程序中所有对象文件的分析数据。
- all
-
如有任何对象文件发生更改均重置分析目录的全部内容。
SUN_PROFDATA_REPLACE 的缺省设置为 SUN_PROFDATA_REPLACE=objfile。
示例:
% setenv SUN_PROFDATA_REPLACE program (csh) $ export SUN_PROFDATA_REPLACE=program (ksh)
如果采用该设置,当执行包含已更改对象文件的程序时,程序中所有对象文件的分析数据都会重置。相关选项包括 -xOn 和 -xipo=n。
- SUN_PROFDATA_ASYNC_INTERVAL= async _ interval
-
设置该环境变量可启用异步分析收集。在异步分析收集模式下,每隔一定时间(持续时间以秒为单位指定)从正在运行的进程收集分析数据。
SUN_PROFDATA_ASYNC_INTERVAL 没有任何作用,除非环境变量 LD_AUDIT、LD_AUDIT_32 或 LD_AUDIT_64 之一设置为 /usr/lib/{,64}/libxprof_audit.so.1。
异步分析收集需要 MT 安全且基于 mmap 的内存分配器,例如 libumem (3LIB) ,通过将 UMEM_OPTIONS 设置为 backend=mmap 指定基于 mmap 的分配。
示例:要从 64 位进程启用时间间隔为 1 分钟的异步分析收集,请指定以下环境变量:
$ env LD_AUDIT_64=/usr/lib/64/libxprof_audit.so.1 SUN_PROFDATA_ASYNC_INTERVAL=60 UMEM_OPTIONS=backend=mmap 64-bit-program [program-args]
- SUN_PROFDATA_ASYNC_VERBOSE= verbose
-
如果设置为非零值,可将来自异步收集器的详细消息输出到 stderr。除非启用异步分析收集,否则 SUN_PROFDATA_ASYNC_VERBOSE 没有任何作用。
- SUN_PROFDATA_CLEANUP_AFTER_EXIT=[ 0| 1]
-
如果设置为 1,可使分析器清除进程调用 exit() 与进程退出完成期间的数据结构。如果设置为 0,可避免在应用程序调用 exit() 之前尚未终止的应用程序线程破坏性干扰分析收集。有关详细信息,请参见 exit (3C) 。缺省设置为 SUN_PROFDATA_CLEANUP_AFTER_EXIT=0。
- file.a
-
静态库
- file.C
-
输入文件
- file.cc
-
输入文件
- file.c++
-
输入文件
- file.cpp
-
输入文件
- file.cxx
-
输入文件
- file.o
-
对象文件
- file.so
-
动态(共享)库
- a.out
-
链接的输出
- xprof_fini.o
-
使用 -xprofile=collect 编译的程序的初始化和终结化处理程序
analyzer(1)、as(1)、c++filt(1)、cc(1)、csh(1)、dbx(1)、gprof(1)、ld(1)、more(1)、nm(1)、prof(1)、tcov(1)
C++ 用户指南、
C++ 迁移指南、
《The C++ Programming Language, Third Edition》,Bjarne Stroustrup 编著,Addison-Wesley 出版,1997
《The C Programming Language》,B. W. Kernighan 和 D. M. Ritchie 合著,Prentice-Hall 出版,1988
Oracle Solaris《链接程序和库指南》
国际标准 (ISO/IEC FDIS 14882),编程语言-C++
某些浮点数学库例程会使用 errno 变量(在 errno.h 中定义)返回错误状态。使用编译器选项 -fast、-xbuiltin、-xlibmieee、-xlibmil、-xlibmopt,编译器可以用不设置 errno 变量的等效优化代码自由替换对浮点函数的调用。此外,-fast 还定义宏 __MATHERR_ERRNO_DONTCARE,允许编译器假定数学函数无需设置 errno。因此,依赖于 errno 的值或者浮点函数调用之后引起浮点异常的用户代码会产生不一致的结果。
解决此问题的一种方法是避免使用 -fast 之类的选项编译此类代码。
但是,如果需要 -fast 优化并且代码依赖于正确设置的 errno 的值或者浮点库调用后出现的相应浮点异常,则应使用以下选项进行编译
-xbuiltin=none -U__MATHERR_ERRNO_DONTCARE -xnolibmopt -xnolibmil
以上选项在命令行上用在 -fast 后面,以禁止编译器优化此类库调用,并确保对数学函数的调用将 errno 设置为记录的值。
到此这篇oreo系统(orocal系统)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/80478.html