如何才能让编译器支持c 11的编译器

IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
使用向量技术可以让程序获得更高的执行速度,阅读本文后您可以了解如何通过手动编码使用向量技术,以及如何利用编译器提供的编译选项让程序进行自动向量化。
除此之外,由于向量类型在大端模式和小端模式下存储方式不同,在从大端模式向小端模式移植带有向量的代码需要进行一定转换以保证程序的正确编译,您也可以从本文中了解应采取的方法和注意事项。
, 技术文档工程师,
李诗坤,IBM 中国研发中心(CDL)技术文档工程师,目前主要从事 Rational XL 编译器产品的用户文档写作,涉及编程语言包括 C、C++、FORTRAN,在编译器项目已有 2 年半经验。
向量技术介绍单指令流多数据流(SIMD,即 Single Instruction, Multiple
Data)是一种采用一个控制器来控制多个处理器,同时对一组数据中的每一个分别执行相同的操作从而实现空间上的并行性的技术。这里提到的一组数据又称向量。AltiVec 是由 Apple、IBM、Motorola PowerPC
联合开发的单指令多数据指令集,每个公司使用不同的名字在市场上进行销售。IBM 把对 AltiVec 的实现和扩展称为 VMX,即 Vector/SIMD
Multimedia Extension,而后又进行了进一步扩展推出了 VSX,即 Vector Scalar Extension。使用向量技术能够获得更快的执行速度,对于类似多媒体这种大量使用算法的应用中效果尤其显著。开发者在使用 XL C, XL C/C++和 XL Fortran 等编译器时可以使用向量技术。本文主要以 XL
C/C++ 编译器为例介绍如何使用向量技术。支持向量技术的 POWER 处理器单指令流多数据流是由处理器支持的,IBM 的 POWER 系列处理器自 POWER6 开始支持 VMX 向量技术,并随后扩展到了 VSX,详见表 1。表 1.POWER 架构支持的向量技术
支持的向量技术
POWER6 in enhanced mode
VMX, VSX 如何使用向量技术手动编码必要条件使用向量技术的必要条件是在编译时指明以下两个编译选项:使用-qarch 编译选项,而且必须指向某个支持向量技术的处理器架构,如-qarch=pwr7,这就要求编译环境中处理器本身支持向量技术。开发者可以使用 less
/proc/cpuinfo 命令在 Linux 平台查询处理器型号。使用-qaltivec 编译选项,否则编译器无法识别下文提到的向量类型和向量操作符。向量类型用户可以使用 vector 或_vector 关键字再加上要声明的变量类型来声明向量类型,例如 vector signed
char。除了计算机的基本变量类型,例如 signed
char,还可以使用 pixel 类型。pixel 是向量技术中的一个新的关键字,一个 pixel 变量占用 2 字节,并分为 4 部分,第一部分占 1 比特,其余三部分分别占 5 比特。所有向量类型都占 16 字节,根据其变量类型不同,每种向量可能包括 2,4,6,8,16 个元素。例如,每个 unsigned char 和 signed
char 占 1 字节,所以 vector unsigned char 和 vector signed
char 包含 16 个对应的基本类型的变量;而每个 unsigned int 和 signed int 占 4 字节,所以 vector unsigned
int 和 vector signed int 包含 4 个对应的基本类型的变量。表 2.向量类型对应的基本类型
vector unsigned char
16 unsigned char
vector signed char
16 signed char
vector bool char
16 unsigned char
vector unsigned short
8 unsigned short
vector unsigned short int
vector signed short
8 signed short
vector signed short int
vector bool short
8 unsigned short
vector bool short int
vector unsigned int
4 unsigned int
vector unsigned long
vector unsigned long int
vector signed int
4 signed int
vector signed long
vector signed long int
vector bool int
4 unsigned int
vector bool long
vector bool long int
vector unsigned long long
2 unsigned long long
vector bool long long
vector signed long long
2 signed long long
vector float
vector double
vector pixel
8 unsigned short 对于上述的某些类型,如 vector unsigned long long, vector bool long
long, vector signed long long 和 vector
double,处理器必须支持 VSX,如 POWER7 及以上处理器。初始化开发者可以通过向量常量(vector
literal)对向量类型进行初始化。向量常量的类型就是第一个括号中的向量类型,其值是第二个括号中一系列的常量表达式表示(如果只有一个常量表达式,则所有向量元素都被赋为该值)。除此之外,还可以使用其他已赋值的向量进行赋值。参考例 1。而对于 C 的程序,开发者还可以用初始化列表。初始化列表以花括号为界,列表中值的个数必须小于或等于向量类型中的元素个数。未指明的元素被初始化为 0。参考例 2。操作符总体而言,向量类型支持以下适用于基本类型的操作符。一元操作符:++,--,+,-,~二元操作符:+,-,*,/,%,&,|,^,&&,&&,[]关系操作符:==,!=,&,&,&=,&=然而,具体的支持情况由向量类型决定,如 bool vector 就不支持加减乘除或大于小于等操作符。这里特别要说明的是下标运算符[]是可以用于向量类型操作的,这让向量类型更像传统意义上的数组。
通过下标运算符就能选中向量中的某个元素。如果所指定的位置超出了有效区间,则结果是未定义的。参考例 1 和例 2 对[]操作符的运用。清单 1#include &stdio.h&
int main()
vector unsigned int v1 = (vector unsigned int)(5,10,15,20);
vector unsigned int v2 = (vector unsigned int)(10);
vector unsigned int v3 = v2;
printf("%i,%i,%i,%i\n",v1[0],v1[1],v1[2],v1[3]);
printf("%i,%i,%i,%i\n",v2[0],v2[1],v2[2],v2[3]);
printf("%i,%i,%i,%i\n",v3[0],v3[1],v3[2],v3[3]);
5,10,15,20
10,10,10,10
10,10,10,10清单 2#include &stdio.h&
int main()
vector unsigned int v2 = {1,2,3,4};
for (i=0;i&4;i++)
printf("%i\n",v2[i]);
4内置向量函数开发者可以利用内置的向量函数来操作向量类型的元素,比如对多个向量进行运算、比较两个向量、将向量从内存中加载到寄存器中、将寄存器中的向量储存到内存中。除了支持 AltiVec Technology Programming Interface Manual 中提及的函数,IBM 的 XL 编译器还进行了扩展,
提供了更多的函数来更有效操作向量。开发者可以在程序中直接调用这些向量函数。参考例 3 中对 vec_cmpeq()函数的使用。清单 3#include &stdio.h&
int main()
vector unsigned char v1 =
{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'};
vector unsigned char v2 = (vector unsigned char) 'a';
vector bool char v3;
v3 = vec_cmpeq(v1,v2);
for (i=0;i&16;i++)
printf("%i\n",v3[i]);
...除了上文提到的[ ]操作符来对向量内元素进行操作,还可以通过以下访问某个指定的向量元素并进行操作。d=vec_extract(a, b) 返回 vector b 中的第 a 个元素
d=vec_insert(a, b, c) 把 vector b 中的第 c 个元素换成 a 值
d=vec_promote(a, b) 返回元素 b 为 a 值的 vector,其余元素都未定义
d=vec_splats(a) 返回所有元素均为 a 值的 vector开发者可以通过编译器的用户文档了解向量函数的更多内容。库函数IBM 的 Mathematical Acceleration
Subsystem(数学加速子系统,简称 MASS)包括了一系列针对 IBM 特定处理器调优的数学函数,搭载于在 XL C, XL C/C++ 和 XL
Fortran 编译器中。MASS 库函数提供了比标准数学库函数更优化的性能。具体而言,MASS 库包括了标量 C/C++函数库,向量函数库和 SIMD 函数库。用户可以显式调用这些函数,步骤如下:在程序中使用 MASS 库函数。了解库函数的命名规则有助于开发者使用这些函数。对于双精度函数:标量函数库沿用了函数基础名称,向量函数库在函数基础名称上加了 v 前缀,而 SIMD 函数库在函数基础名称上加了 d2 后缀。对于单精度函数:标量函数库在函数基础名称上加了 f 后缀,向量函数库在函数基础名称上加了 vs 前缀,而 SIMD 函数库在函数基础名称上加了 f4 后缀。我们以 acos()函数为例。acos(x)函数返回 x 的 acosin 值。表 3.acos 函数对应的 MASS 标量函数,MASS 向量函数和 MASS SIMD 函数
标量函数 acos()acosf() 向量函数 vacos()vsacos() SIMD 函数 acosd2()acosf4()在程序中包含对应的头文件。在编译时链接对应的库。例如如果需要链接 libmass.a,则编译时还需要在命令行再输入 -lmass 选项。以 XL C/C++ for Linux, 13.1 对应的头文件和库为例:表 4.XL C/C++ for Linux, 13.1 中 MASS 函数库对应的头文件和库文件头文件名称库名称及说明 标量函数库
math.h libmass.a针对 32 位处理器libmass_64.a针对 64 位处理器 向量函数库
libmassvp5.a
已针对 POWER5 调优
libmassvp6.a
已针对 POWER6 调优
libmassvp7.a
已针对 POWER7 调优
libmassvp8.a
已针对 POWER8 调优
SIMD 函数库
math_simd.h
libmass_simdp7.a
针对 32 位 POWER7 处理器并调优
libmass_simdp7_64.a
针对 64 位 POWER7 处理器并调优
libmass_simdp8.a
针对 32 位 POWER8 处理器并调优
libmass_simdp8_64.a
针对 64 位 POWER7 处理器并调优 好处和下文提到的代码自动向量化,开发者在代码中直接使用向量技术能精准地利用向量技术的优势,而且通常能避免无法预料的结果。但是手动使用向量技术编程对开发者要求较高,而且可能需要系统性地进行代码改造。自动向量化除了手动编程方法,开发者还可以在编译时启用对应的编译选项将程序自动向量化。-qsimd-qsimd 控制了编译器是否能自动利用处理器所支持的向量指令。-qsimd=auto 将某些循环中的对数组中连续元素的操作转化为 VMX 或 VSX 指令。向量指令能一次性计算多个结果,比顺序执行要快。这对于含有大量图像处理的程序非常有用。-qhot=vector当-qhot=vector 生效时,对于某些对于数组中连续元素的循环操作,如求平方根或反平方根,编译器会调用 MASS 库函数中对应的函数。-qhot=vector 支持单精度和双精度浮点数学运算,所以对于需要处理大量数学运算的程序非常有用。当-qhot=vector 生效时,在程序调用系统数学函数时,编译器通过衡量函数名、调用次数等确定是否进行自动向量化,如果是,则转化为调用对应的 MASS 向量函数,某些函数如 vdnit,vdint,vcosisin 除外。如果无法向量化,编译器会尝试调用对应的 MASS
SIMD 函数。介绍了如何通过自动向量化使用 MASS 高性能数学库,并展示了加速后的效果。需要注意的是,由于向量化可能影响程序结果的精确性,如果这种精确性偏差超出了接受范围,则开发者可以用-qhot=novector 来关闭上述操作。-O 优化选项除了由开发者显示开启编译选项,XL 编译器将一些有利于提高性能的优化操作打包起来,提供从 O2 到 O5 的预定义优化等级,供开发者在不熟悉如何组合各种编译选项来提高性能时使用。例如,-O4 和-O5 优化等级包含了-qhot=vector 和-qsimd=auto;对于 POWER7 及以上的处理器,-O3
-qhot 优化等级已包含了-qsimd=auto。通常,更高的优化等级是在其上一个优化等级的基础上新增了其它编译选项。当以下编译选项或编译选项组合生效时,-qhot=vector 也被启用。 -qhot -qnostrict -qignerrno -qhot -O3 -O4 -O5字节顺序字节顺序是指当数据存储跨多个字节时最高有效字节和最低有效字节在内存中的存放方式。在大端模式下,数据的最高有效字节存放在低地址;在小端模式下,数据的最低有效字节存放在低地址。例如一个跨 4 个字节的 32 位 int 型数 0x,其最高有效字节是 0x12,最低有效字节是 0x78,它在 CPU 内存中有两种存放方式,此处假设从地址 0x0000 开始存放:表 5.内存存放布局(方式 1:大端模式 )
0x78 表 6.内存存放布局(方式 2:小端模式 )
0x12 方式 1 的存放形似称为大端模式,最高有效字节 0x12 存放在低地址中,方式 2 的存放形似称为小端模式,最低有效字节 0x78 存放在低地址中。这两种模式并没有本质上的区别,大多数开发者并不用关心具体的细节。但如果涉及代码在两种模式下移植时,就需要格外注意。常见的大端模式的机型有:IBM Power 系列、IBM z 系列常见的小端模式的机型有:Intel x86 系列值得一提的是,IBM Power8 既支持大端模式,也支持小端模式。字节顺序影响向量存储由于所有向量变量都占 16 字节并以 16 字节对齐,这决定了在内存中是向量是跨字节存储的。向量的存储在大端模式下和小端模式下不同,让我们来看一个简单的例子:初始化向量 v,v 含有四个元素:例 4vector unsigned int v = {1,2,3,4};向量元素在内存中存放布局如图 2 所示:表 7.向量元素在内存中的存放布局(大端模式) 地址
ADD ADD+0x1ADD+0x2ADD+0x3 向量元素 v[0]v[1]v[2]v[3] 元素值
4 表 8.向量元素在内存中的存放布局(小端模式) 地址
1 若程序需要在大端模式和小端模式间进行移植,开发者需要关注字节顺序不同带来的变化,可能需要进行某些转换以保证数据的正确性。总体而言,字节存储顺序对大多数向量函数并没有影响,比如当使用 vec_add(a,b)求向量 a 和向量 b 对应元素的和,在大端模式和小端模式上并无区别。然而,以下三类函数会受到向量元素顺序的影响:加载函数 vec_xl(a, b):从指针 b 加上 a 偏移量处开始加载一个向量 vec_ld(a, b):从指针 b 加上 a 偏移量后截取 16 的倍数开始加载一个向量 vec_xld2(a, b):从指针 b 加上 a 偏移量处开始加载由两个 8 字节的元素合成的一个向量 vec_xlw4(a, b):从指针 b 加上 a 偏移量处开始加载由四个 4 字节的元素合成的一个向量存储函数 vec_xst(a, b, c):向指针 c 加上 b 偏移量处存储向量 a vec_st(a, b, c):向指针 c 加上 b 偏移量后截取 16 的倍数处存储向量 a vec_xstd2(a, b, c):向指针 c 加上 b 偏移量处按照 a 向量的值存储两个 8 字节的元素 vec_xstw4(a, b, c):向指针 c 加上 b 偏移量处按照 a 向量的值存储四个 4 字节的元素指向某个向量元素的函数 vec_extract(a, b):返回向量 b 中第 a 个元素的值 vec_insert(a, b, c):复制向量 b,并将其第 c 个元素的值变为 a vec_mergeh(a, b):合并向量 a 和向量 b 的最高 8 字节后成为的向量 vec_mergel(a, b):合并向量 a 和向量 b 的最低 8 字节后成为的向量 vec_pack(a, b): 截取向量 a 和向量 b 每个元素的低位并合后成为的向量
vec_promote(a, b):返回一个向量,其第 b 个元素的值是 a vec_splat(a, b): 返回一个向量,其所有元素的值都等于向量 a 的第 b 个元素 vec_unpackh(a):返回一个向量,其每个元素都是向量 a 中对应元素的最高 8 字节 vec_unpackl(a):返回一个向量,其每个元素都是向量 a 中对应元素的最低 8 字节 vec_perm(a, b, c):按照字符向量 c 所指明的元素下标选择向量 a 和向量 b 中的元素,返回一个向量从大端模式向小端模式移植带有向量的代码现在,小端模式有着越来越好的生态圈,IBM 针对 Linux 也推出了小端模式,开发者可能希望把已有的基于大端模式的程序移植到小端模式平台。为了让开发者花最小的代价进行这种移植,XL
C/C++ for Linux (little-endian distributions),
13.1.1 版本编译器新增了一个编译选项-qaltivec=be。-qaltivec=be 表示内存中向量元素的顺序遵循大端模式。在移植遵循大端模式的已有代码时,这个编译选项不改变向量元素在内存中存储的字节顺序,即内存依然沿用移植前的大端模式,即对例 4 中向量 v 的存储应如图 3 所示,只是在调用上述提到的与字节顺序有关的向量函数时,对向量元素顺序进行处理以符合现在的小端模式环境。在移植后,现在的编译环境是小端模式,即向量元素从高地址向低地址依次排列,在-qaltivec=be 编译选项生效时:加载函数使用 vec_ld(), vec_xld2(), vec_xlw4(),
vec_xl()把数据从内存加载到向量寄存器时,编译器会逆转向量元素的顺序,即寄存器中向量会以小端模式储存,符合处理器的小端模式字节顺序。以图 4 为例。表 9.内存中向量存储(内存(移植前的大端模式)) 地址 ADD1ADD1+0x1ADD1+0x2ADD1+0x3 向量元素 v[0]v[1]v[2]v[3] 元素值
4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&小端模式下字节顺序&&&&&&&&&&&&&&&&&&&&&&&移植到小端模式平台后,假设寄存器直接沿用以上布局,按照小端模式字节顺序,向量元素排序变成 4,3,2,1,与程序意图不符。启用-qaltivec=be 后,编译器会逆转向量元素的顺序,即寄存器中向量会以小端模式储存,寄存器的布局变为图 4 所示:表 10.-qaltivec=be 下寄存器中向量存储 向量元素 v[0]v[1]v[2]v[3] 元素值
1 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&小端模式下字节顺序&&&&&&&&&&&&&&&&&&&&&&&我们看到启用-qaltivec=be 后寄存器的布局向量元素的顺序发生了逆转,按照小端模式,向量元素排列变成 1,2,3,4,符合程序意图。存储函数使用 vec_st(), vec_xstd2(), vec_xstw4(),
vec_xst()把数据从向量寄存器储存到内存时,编译器会逆转向量元素的顺序,即内存中向量会以大端模式储存,即从图 5 向图 6 进行转换,从而符合内存中原本的大端模式字节顺序。表
11.寄存器中向量存储 向量元素 v[0]v[1]v[2]v[3] 元素值
1 表 12.-qaltivec=be 下内存中向量存储 地址 ADD2ADD2+0x1ADD2+0x2ADD2+0x3 向量元素 v[0]v[1]v[2]v[3] 元素值
4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&大端模式下字节顺序&&&&&&&&&&&&&&&&&&&&&&&&指向某个向量元素的函数对于 vec_extract(), vec_insert(), vec_mergeh(), vec_mergel(), vec_pack(),
vec_promote(), vec_splat(), vec_unpackh(), vec_unpackl(),
vec_erm(),编译器会以大端模式字节顺序计算元素位置,使之符合向量元素的正确顺序。-qaltivec=be 只能影响上述提到的向量函数,对于用 union 初始化向量的情况不能产生影响,参考例 5,在小端模式下 union 初始化向量始终按照小端模式。开发者应该用 vec_xl 或 vec_ld 加载函数替代 union,以保证与后续操作一致,即同时受-qaltivec=be 影响。清单 5int main()
vector signed int a4;
int c4[4];
x.c4[0] = 0;
x.c4[1] = 1;
x.c4[2] = 2;
x.c4[3] = 3;
}对于在小端模式下新开发的程序,开发者应该直接使用默认的小端模式,即使用-qaltivec 或-maltivec 编译选项,其默认值就是符合小端模式,开发者不要使用以上提到的-qaltivec=be 进行任何转换,否则可能出现错误,参考例 6。清单 6#include &stdio.h&
int main()
vector signed int a4;
int c4[4] = {0,1,2,3};
a4 = vec_xlw4(0, c4);
//vec_xlw4 将会受到 -qaltivec=be|le 影响
printf("%i %i %i %i\n", a4[0], a4[1], a4[2], a4[3]);
//在小端模式下,[]操作符不受-qaltivec=be|le 影响,向量元素的始终从高地址向低地址依次排列
for(i=0;i&4;i++)
printf("%i ", vec_extract(a4,i));
//vec_extract 将会受到 -qaltivec=be|le 影响
printf("\n");
}这里我们使用的是 POWER7 小端模式处理器,分别使用-qaltivec=be 和-qaltivec(等同于-qaltivec=le)进行编译,结果如下:
xlc altivec_1.c -qaltivec=be -qarch=pwr7
xlc altivec_1.c -qaltivec -qarch=pwr7
0 1 2 3我们可以看到启用-qaltivec=be 后打印出的第一行的向量元素顺序被颠倒了。这是因为 vec_xlw4 受-qaltivec=be 影响,在把向量从内存加载到寄存器时逆转了向量元素顺序,按照大端模式进行存储,但是由于[]操作符不受-qaltivec=be 影响,始终按照小端模式计算向量元素位置,所以打印时向量元素顺序被颠倒了,与程序意图不符。启用-qaltivec=be 后打印出的第二行的向量元素顺序正确,这是因为 vec_extract 和 vec_xlw4 一样受-qaltivec=be 影响,在计算向量元素位置时也是按照大端模式,相当于“负负得正”,也符合了程序的意图。在编程时开发者可能不会意识到[]操作符和 vec_extract()的在启用-qaltivec=be 时存在的差别,最好的办法就是在小端模式下遵循-qaltivec 的默认值,始终可以得到正确的结果,如例 6 的编译结果所示。对于 XL C/C++ for Linux (little-endian distributions),
13.1.1 版本,开发者只能使用-qaltivec 来开启 be 子选项,以后其 GCC 对应的选项-maltivec 也会新增 be 子选项,方便开发者使用。致谢衷心感谢 IBM 工程师郭久福(Jeff Guo)审阅本文并提出宝贵建议!
参考资料 :包括如何使用编译器的详细说明。访问 ,获得关于 IBM Rational 软件交付平台(Rational
Software Delivery Platform)产品的技术资源和最佳实践。加入 ,developerWorks 社区是一个面向全球 IT
专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
为灾难恢复构建应用,赢取现金大奖。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=RationalArticleID=1002231ArticleTitle=以 XL C/C++ 编译器为例使用向量技术编程publish-date=C#的csc编译器的用法 - 我不是高手 - 博客园
知道用户需求,做到专注!c#,donet,Frameworks,UML,面向对象,设计模式!
posts - 322, comments - 126, trackbacks - 1, articles - 11
CSC.exe把Visual C#程序代码编译成IL文件时,有着很多参数和开关选项。正确的了解和运用这些参数和开关有时会解
决一些看似很棘手的问题。下面就通过一张表来大致说明一下这些参数和开关的具体作用。这些参数和开关选项是按照
字母顺序来排列的。其中带"*",是一些常用的参数或开关。
///////////////////////////////////////////////////////////////////////////////
命令行示例
编译 File.cs 以产生 File.exe:
csc File.cs
编译 File.cs 以产生 File.dll:
csc /target:library File.cs
编译 File.cs 并创建 My.exe:
csc /out:My.exe File.cs
通过使用优化和定义 DEBUG 符号,编译当前目录中所有的 C# 文件。输出为 File2.exe:
csc /define:DEBUG /optimize /out:File2.exe *.cs
编译当前目录中所有的 C# 文件,以产生 File2.dll 的调试版本。不显示任何徽标和警告:
csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs
将当前目录中所有的 C# 文件编译为 Something.xyz(一个 DLL):
csc /target:library /out:Something.xyz *.cs
///////////////////////////////////////////////////////////////////////////////
在做一个page时用到tabscript了, 记得IE WebControl好像有的, 去网上找吧。结果发现Microsoft已经不支持这个
控件了,也不提供下载了。。。 没办法,只好又找Google帮忙了。 很快就找到了。 安装完后run build.bat. 结果只
把runtime的文件复制过来了, 没有生成DLL文件。。。 看了看build.bat是这么写的:
@if "%_echo%"=="" echo off
if not exist build mkdir build
csc.exe /out:build\Microsoft.Web.UI.WebControls.dll @IEWebControls.rsp
xcopy src\Runtime build\Runtime /E /Y /I /Q
注意红色的, 它用的是CSC.exe 没有写绝对的路径。可是我的PATH里根本就没有注册过。 改成
C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322/csc.exe /out:build\Microsoft.Web.UI.WebControls.dll
@IEWebControls.rsp
就可以了, 不过有个警告:src\treeview.cs(1193,13): warning CS0618:
'System.Xml.Xsl.XslTransform.Transform(System.Xml.XPath.XPathNavigator, System.Xml.Xsl.XsltArgumentList,
System.IO.Stream)' is obsolete: 'You should pass XmlResolver to Transform() method'
呵呵,我没有管它,能用就可以了。 因为要放到服务器上,所以就不能按照它的说明文件把运行需要的文件复制到
c:\Inetpub\wwwroot. 怎么办呢? 在web.config里就可以设置, 加入下面的代码就可以了。
&configSections&
&section name="MicrosoftWebControls" type="System.Configuration.NameValueSectionHandler, System,
System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral,
PublicKeyToken=b77a5c" /&
&/configSections&
&MicrosoftWebControls&
&&&& &add key="CommonFiles" value="/website/webctrl_client/1_0" /&
&/MicrosoftWebControls&
////////////////////////////////////////////////////////////////////////////////////
@ * 指定响应文件。
/?, /help 在控制台的计算机屏幕上显示编译器的选项
/addmodule 指定一个或多个模块为集会的一部分
/baseaddress指定装入DLL的基础地址
/bugreport 创建一个文件,该文件包含是报告错误更加容易的信息
/checked 如果整数计算溢出数据类型的边界,则在运行时产生一个例外的事件
/codepage 指定代码页以便在编译中使用的所有源代码文件
/debug * 发送调试信息
/define 定义预处理的程序符号
/doc * 把处理的文档注释为XML文件
/fullpaths 指定编译输出文件的反正路径
/incremental 对源代码的文件进行增量编译
/linkresource 把.NET资源链接到集合中
/main 指定Main方法的位置
/nologo 禁止使用编译器的标志信息
/nooutput 编译文件但不输出文件
/nostdlib 不导出标准库(即mscorlib.dll)
/nowarn 编译但编译器并不显示警告功能
/optimize 打开或者关闭优化
/out * 指定输出文件
/recurse 搜索编译源文件的子目录
/reference * 从包含集合的文件中导入元数据
/target * 指定输出文件的格式
/unsafe 编译使用非安全关键字的代码
/warn 设置警告级别
/warnaserror 提升警告为错误
/win32icon 插入一个.ico文件导输出文件中去
/win32res 插入一个Win32资源导输出文件中
  具体说明:
  这个选项是用来指定响应文件。响应文件是一种包含了许多编译选项的文件。这些编译选项将和源代码文件一起由
编译器进行处理。一般来说此种响应文件是以文本文件形式出现。他的扩展名是.rsp。在响应文件中是用#符号表示开
始的注释。
  例:以下是一个响应文件resp1.rsp的内容:
  # 这是一个简单的响应文件,文件名称为resp1.rsp
  #使用方法: csc @resp1.rsp
/target:exe /out:sample.exe sample.cs
  此响应文件的作用就是把sample.cs文件编译成sample.exe文件。如果在一次编译中要指定多个响应文件,可以指
定多个响应文件选项,如:
@file1.rsp @file2.rsp
  二./?和/help
  这个选项应该不必多说,那些用过DOS程序的人,大概都会用这个选项。
  三./addmodule
  本选项是使编译器搜集从用户正在编译的工程到可用文件中所以类型的信息。所有添加了/addmodule的模块在运行
时必须与输出文件在同一目录中。这就是说,用户可以在编译时指定任何目录中的模块,但在运行时这个模块必须在应
用程序目录中。文件中不能包含汇编名单。例如:如果输出文件用/taarget:module创建,其元数据可以用/addmodule
  例子:把二个模块加入myProject.cs中
csc /addmodule:module1.module2.dll myProject.cs
  四./baseaddress
  本选项允许用户指定载入DLL时的首选地址,这个首选地址可以是十进制、十六进制、八进制。DLL的缺省首选地址
在.Net运行时设置。如果目标文件不是DLL文件,这个选项将被忽略。
  例子:把myLibrary.cs 编译程DLL文件,并且当此DLL在.Net运行环境被载入时的地址是0x1111000
csc /baseaddres:0x1111000 /target:library myLibrary.cs
  五./bugreport
  这个选项用来报告编译时的错误信息。在报告中包含以下内容:
  1).编译中所有源代码的一个拷贝
  2).在编译中所有的编译选项
  3).编译信息,包括编译器、运行时间、操作系统的版本信息
  4).编译器输出
  5).问题的描述
  6).如何解决问题的描述
  例子:生成一个bugs.txt文件,并把错误报告放在文件里面
csc /bugreport:bugs.txt Hello.cs
  六./checked
  此选项指定不在检验或或者未检验关键字范围内以及导致超出数据类型范围的值的整数计算语句是否产生运行例外
。具体的说就是,如果不在检验或者未检验关键字范围内的整数计算语句产生的值在数据类型允许的范围之外,并且在
编译中使用了/checked+(/checked),该语句就会在运行时产生例外,如果在编译时使用了/checked-,在运行时该语句
就不会产生例外。
  例子:编译myMath.cs,并且指定一个不在检验或者未检验关键字范围内的整数计算语句(且其产生的值超出数据
类型的范围),将在运行时引起例外。
csc /checked+ myMath.cs
  七./codepage
  如果用户编译的一个或者多个源代码不使用计算机上的默认代码页,可以使用/codepage选项来指定希望使用的代
码页。/codepage适用于编译中所有的源代码文件。
  如果源代码文件在计算机上的同一个代码页位置创建,或者源代码文件用UNICODE或者UTF-8来创建,用户就不需要
使用/codepage了。
  八./debug
  此选项是在调试时候使用的,当调试者启用了这个选项来调试自己的程序,将会创建一个.pdb文件,并把各种调试
信息写到此文件里。有2中选项来指定调试的类型:
  /debug [+/-] :当选用/debug +就会把创建.pdb文件,并把调试信息存储到里面;/debug -是一个缺省设置,就是
不产生任何调试信息。
  /debug:[full/pdbonly] :当使用/debug:full就是创建缺省的调试信息,有点类似/debug+选项。/debug: pdbonly
选项是创建.pdb文件,并且你只能使用源代码调试在调试工具里。
  例子:编译Hello.cs并且为Hello.cs创建调试信息
   csc /debug+ HelloWorld.cs
  九./define
  此选项在程序中定义了一个符号,他和在源程序中使用#define预处理程序指示功能相同,此符号保持已定义状态
,直到源文件中的#undef指示符删除定义或者编译器已到达了文件末尾。你可以用/d简写来代替。
  例子:下面是my.cs的源程序
public class myBuild{
public static void Main() {
#if (final)
Console.WriteLine("Final Build");
Console.WriteLine("Trial Build");
  如果用csc /define:final my.cs来编译就会显示"Final Build",如果没有/define,编译后执行就会显示"Trial
  十./doc
  文档在当今已经变得愈来愈重要了,一个好的程序应该配有相当的文档。如果你在写程序的文档中用的是"///"标
识符来注释。当你使用/doc选项来编译时,你的所以注释文档将会自动的保留在一个XML文件中。
  例子:以下是my.cs 的源程序
/// This is a sample class that has some documentation
public class myDocument {
/// Main entry point of the class
public static void Main (string[] argv)
Console.WriteLine("A Sample Class") ;
  用下列编译语句会产生my.xml文件,看看my.xml文件到底存储了什么东西。
Csc /doc:my.xml my.cs
  十一./fullpaths
  在默认情况下,编译产生的错误或者警告都只会指明发现错误的文件名称,加入此选项使得在编译器产生错误或者
警告的时候会显示完整的路径。你可以把上面的my.cs程序语法搞错,再用 csc /fullpaths my.cs 和 csc my.cs分别
编译,看看错误提示有什么不同。
  十二./incremental
  本选项主要是激活增量编译器,这种编译器只对上次编译后发生改变的函数进行编译。如果在编译时候选用
了/debug选项,调试信息的状态存储在相应的.pdb文件中。除此编译时的信息都存储在.incr文件中,此.incr文件的名
称为output_file_name.extension.incr。即如果输出文件时out.exe,则此文件对应的incr文件是out.exe.incr文件。
  例子:利用增量编译器来编译文件
csc /incremental /out:my.exe my.cs
  如果编译成功则会产生2个文件,分别是:my.exe和my.exe.incr。
  十三./linkresource
  这个选项就是在输出文件中创建到.Net资源的链接。他的简写是/linkres。资源文件就是在那些在工程文件中使用
到的所有的资源,像图片、声音等。这个选项只是对于资源文件建立链接,这样有助于管理使用同一资源的程序,而不
需要多个副本。此选项的具体语法如下:
/linkresource:filename,identifier,mimetype
  其中:
  filename:是想建立链接的.Net的资源文件
  identifier(可选):资源的逻辑名称,该名称用于载入资源,默认名称是文件名称。
  mimetype(可选):是一个代表资源的媒介类型的字符串。默认为空。
  例子:在文件中建立一个指向reso.resource的链接
csc /linkres:reso.resource myResource.cs
  十四./main
  当我们编译二个或者多个拥有Main方法的Class,我们可以使用这个选项让用户指定最终的输出文件中的使用那个
Main的方法。
  例子:编译二个文件,但输出文件中的Main方法来自Main1 Class
csc myMain1.cs myMain2.cs /main:Main1
  十五./nologo
  这个选项禁止在编译器启动时显示开始标志和编译过程中显示报告信息。
  例子:
csc /nologo my.cs
  十六./nooutput
  编译文件,但不创建任何输出文件。用户可以看到任何编译错误和警告。
  例子:
csc /nooutput my.cs
  十七./nostdlib
  这个选项禁止导入mscorlib.dll。这个DLL包含了这个系统名称空间。当用户希望使用自己的系统名称空间时,一
般才会使用此选项。
  例子:编译文件,但不导入mscorlib.dl
csc /nooutput myOutput.cs
  十八./nowarn
  本选项是在编译过程中禁止指定的警告类型。如果是禁止多个警告类型,用逗号分隔。
例子:在编译过程中禁止警告类型CS0108和CS0109
csc /nowarn:108,109 Warn.cs
  十九./optimize
  本选项激活或者禁用由编译器执行优化。优化的结果是使得输出文件更小、更快、更有效率。缺省是/optimize执
行优化,如果你选用了/optimize-则禁止优化。/o是/optimize的简写。
  例子:编译文件,并禁止优化
csc /optimise- my.cs
  二十./out
  在没有指定输出文件的情况下,如果通过编译器编译后文件是EXE文件,则输出文件将从包含Main方法的源代码的
文件中获得名字;如果编译后的文件是DLL文件,将从第一个源代码文件中获得名字。如果用户想要指定输出文件名称
,就可以使用此选项。
  例子:编译HelloWord.cs文件,并把输出文件命名为Hello.exe
csc /out:Hello.exe helloworld.cs
  二十一./recurse
  此选项允许用户编译在指定目录或者工程目录的所以子目录中的所有源代码文件。用户可以使用通配符来编译工程
目录下的所有匹配文件。
  例子:编译/dir1/dir2目录下及其下级目录中的所有C#文件,并生成dir2.dll
csc /target:library /out:dir2.dll /recurse: dir1\dir2\*.cs
  二十二./refrence
  此选项可使得当前编译工程使用指定文件中的公共类型信息。这个选项对于初学者是很重要的。此选项的简写是/r
。你必须引用在程序代码中使用"using"关键字导入的所有文件,如果在你的程序中,使用了自己编写的类库,在编译
时也必须引用。
  例子:编译文件,并引用在程序中使用的文件
csc /r:system.myExec.myLibrary.dll myProject.cs
  (注:其中那个myExec.exe和myLibrary.dll时自己创建的)
  二十三./target
  这个选项是告诉编译器你所想得到什么类型的输出文件。除非使用/target:module选项,其他选项创建的输出文件
都包含着汇编名单。汇编名单存储着编译中所有文件的信息。在一个命令行中如果生成多个输出文件,但只创建一个汇
编名单,并存储在第一个输出文件中。
  下面是/target的4种用法:
  /target:exe 创建一个可执行(EXE)的控制台应用程序
  /target:library 创建一个代码库(DLL)
  /target:winexe 创建一个windows程序(EXE)
  /target:module 创建一个模块(DLL)
  例子:
  csc /target:exe myProj.cs // 创建一个EXE文件
  csc /target:winexe myProject.cs file://创建一个windows程序
  csc /target:library myProject.cs file://创建一个代码库
  csc /target:module myProject.cs file://创建一个模块
  二十四./resource
  此选项和/linkresource正好相反。他的作用是把.Net资源文件嵌入到输出文件中,参数、用法都和/linkresource
也相同,具体可参考前面/linkresource选项。
  二十五./unsafe
  此选项是告诉编译器采用非安全模式编译文件
  例子:用非安全模式编译my.cs
csc /unsafe my.cs
  二十六./warn
  使用本选项是在编译过程中采用什么等级的警告级别
警告级别 含义
0 关闭所有警告
1 只显示严重警告
2 级别为1的警告和某些不严重的警告
3 级别为2的警告和某些不算非常严重的警告
4 级 别为3的警告和信息警告
  例子:编译文件,不显示任何错误
csc /warn:0 my.cs
  二十七./warnaserror
  告诉编译器把在编译中把所有的警告当成错误来处理。/warnaserror-是缺省选项,在该选项下编译中的警告不影
响文件的输出。/warnaserror和/warnaserror+是一样的。
  例子:编译文件,并在编译中把警告当成错误
csc /warnaserror myj.cs
  二十八./win32icon
  在输出文件中插入一个图标文件(.ico)。从而在Windows中的资源管理器中就看到以此图标标识的文件了。
  例子:
csc /win32icon:myicon.ico my.cs
  二十九./win32res
  在输出文件中添加一个win32的资源文件。此资源文件包括用户应用程序的版本信息或者位图(图标)信息。如果
用户不指定/win32res,编译器将根据汇编版本生成版本信息。
  例子:添加一个win32资源文件到输出文件中
csc /win32res:winrf.res mt.cs
  以上就是Csc.exe在编译C#文件中的全部选项。了解并掌握这些选项有时对我们编程是大大有用的}

我要回帖

更多关于 支持c 11的编译器 的文章

更多推荐

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

点击添加站长微信