编译选项链接选项
⑴ 如何设置NDK的编译选项
1. 概述
首先回顾一下 Android NDK 开发中,Android.mk 和 Application.mk 各自的职责。
Android.mk,负责配置如下内容:
(1) 模块名(LOCAL_MODULE)
(2) 需要编译的源文件(LOCAL_SRC_FILES)
(3) 依赖的第三方库(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)
(4) 编译/链接选项(LOCAL_LDLIBS、LOCAL_CFLAGS)
Application.mk,负责配置如下内容:
(1) 目标平台的ABI类型(默认值:armeabi)(APP_ABI)
(2) Toolchains(默认值:GCC 4.8)
(3) C++标准库类型(默认值:system)(APP_STL)
(4) release/debug模式(默认值:release)
由此我们可以看到,本文所涉及的编译选项在Android.mk和Application.mk中均有出现,下面我们将一个个详细介绍。
2. APP_ABI
ABI全称是:Application binary interface,即:应用程序二进制接口,它定义了一套规则,允许编译好的二进制目标代码在所有兼容该ABI的操作系统和硬件平台中无需改动就能运行。(具体的定义请参考 网络 或者 维基网络 )
由上述定义可以判断,ABI定义了规则,而具体的实现则是由编译器、CPU、操作系统共同来完成的。不同的CPU芯片(如:ARM、Intel x86、MIPS)支持不同的ABI架构,常见的ABI类型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。
这就是为什么我们编译出来的可以运行于Windows的二进制程序不能运行于Mac OS/linux/Android平台了,因为CPU芯片和操作系统均不相同,支持的ABI类型也不一样,因此无法识别对方的二进制程序。
而我们所说的“交叉编译”的核心原理也跟这些密切相关,交叉编译,就是使用交叉编译工具,在一个平台上编译生成另一个平台上的二进制可执行程序,为什么可以做到?因为交叉编译工具实现了另一个平台所定义的ABI规则。我们在Windows/Linux平台使用Android NDK交叉编译工具来编译出Android平台的库也是这个道理。
这里给出最新 Android NDK 所支持的ABI类型及区别:
那么,如何指定ABI类型呢?在 Application.mk 文件中添加一行即可:
APP_ABI := armeabi-v7a //只编译armeabi-v7a版本
APP_ABI := armeabi armeabi-v7a //同时编译armeabi,armeabi-v7a版本
APP_ABI := all //编译所有版本
3. LOCAL_LDLIBS
Android NDK 除了提供了Bionic libc库,还提供了一些其他的库,可以在 Android.mk 文件中通过如下方式添加依赖:
LOCAL_LDLIBS := -lfoo
其中,如下几个库在 Android NDK 编译时就默认链接了,不需要额外添加在 LOCAL_LDLIBS 中:
(1) Bionic libc库
(2) pthread库(-lpthread)
(3) math(-lmath)
(4) C++ support library (-lstdc++)
下面我列了一个表,给出了可以添加到“LOCAL_LDLIBS”中的不同版本的Android NDK所支持的库:
下面是我总结的一些常用的CFLAGS编译选项:
(1)通用的编译选项
-O2 编译优化选项,一般选择O2,兼顾了优化程度与目标大小
-Wall 打开所有编译过程中的Warning
-fPIC 编译位置无关的代码,一般用于编译动态库
-shared 编译动态库
-fopenmp 打开多核并行计算,
-Idir 配置头文件搜索路径,如果有多个-I选项,则路径的搜索先后顺序是从左到右的,即在前面的路径会被选搜索
-nostdinc 该选项指示不要标准路径下的搜索头文件,而只搜索-I选项指定的路径和当前路径。
--sysroot=dir 用dir作为头文件和库文件的逻辑根目录,例如,正常情况下,如果编译器在/usr/include搜索头文件,在/usr/lib下搜索库文件,它将用dir/usr/include和dir/usr/lib替代原来的相应路径。
-llibrary 查找名为library的库进行链接
-Ldir 增加-l选项指定的库文件的搜索路径,即编译器会到dir路径下搜索-l指定的库文件。
-nostdlib 该选项指示链接的时候不要使用标准路径下的库文件
(2) ARM平台相关的编译选项
-marm -mthumb 二选一,指定编译thumb指令集还是arm指令集
-march=name 指定特定的ARM架构,常用的包括:-march=armv6, -march=armv7-a
-mfpu=name 给出目标平台的浮点运算处理器类型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16
-mfloat-abi=name 给出目标平台的浮点预算ABI,支持的参数包括:“soft”, “softfp” and “hard”
⑵ 怎么理解C++编译、连接、运行
编译是将各个模块转化为机器语言的对象文件
连接就是把这些对象文件再组合,将模块与模块之间的入口与出口衔接起来
例如你自己写个单文件程序,你自己的程序是一个模块
然后你在头文件里面调用的东西又是几个模块
各个模块之间被调用的函数称为符号
编译的时候引用其他模块的地方用符号标注,但是不指向实际地址
连接的时候将模块进行组合,求得各个符号的偏移地质,再按照符号列表填入各个模块实现实际调用,这才是一个完整的程序
运行就不多说了,就是把程序调入机器完成特定逻辑的步骤
⑶ 以下哪个编译链接选项对程序的启动速度影响大
一、选择题((1)—(40)每题1分,(41)—(50)每题2分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。
??
(1) 在32位计算机中,一个字长所占的字节数为( )。
A) 1
B) 2
C) 4
D) 8
??
(2) 与十进制数511等值的十六进制数为( )。
A) 1FF
B) 2FF
C) 1FE
D) 2FE
??
(3) 能将高级语言编写的源程序转换成目标程序的是( )。
A) 编程程序
B) 编译程序
C) 解释程序
D) 链接程序
??
(4) 在计算机系统中,存储一个汉字的国标码所需要的字节数为( )。
A) 1
B) 2
C) 3
D) 4
??
(5) 下列带有通配符的文件名中,能表示文件ABC.TXT的是( )。
A) *BC.?
B) A?.*
C) ?BC.*
D) ?.?
??
(6) 在多媒体计算机系统中,不能用以存储多媒体信息的是( )。
A) 光缆
B) 软盘
C) 硬盘
D) 光盘
??
(7) DOS命令“COPY/?”的功能是( )。
A) 将当前盘当前目录中的所有文件复制到当前盘的根目录下
B) 将当前盘当前目录中所有以单个字符命名的文件复制到当前盘的根目录下
C) 以提示方式复制文件
D) 显示COPY命令的帮助信息
??
(8) 在Windows环境下,若要将当前活动窗口存入剪贴板,则可以按( )。
A) Ctrl+PrintScreen键
B) Ctrl+PrintScreen键
C) Shift+PrintScreen键
D) PrintScreen键
??
(9) 在Windows环境下,单击当前应用程序窗口中的“关闭”按钮,其功能是( )。
A) 将当前应用程序转为后台运行
B) 退出Windows后再关机
C) 退出Windows后重新启动计算机
D) 终止当前应用程序的运行
??
(10) 在Windows环境中,粘贴按钮是( )。
A) ctrl+A
B) ctrl+C
C) ctrl+X
D) ctrl+V
??
(11) 以下叙述中正确的是( )。
A) 构成C程序的基本单位是函数
B) 可以在一个函数中定义另一个函数
C) main()函数必须放在其它函数之前
D) 所有被调用的函数一定要在调用之前进行定义
??
(12) 以下选项中合法的实型常数是( )。
A) 5E2.0
B) E-3
C) .2E0
D) 1.3E
??
(13) 以下选项中合法的用户标识符是( )。
A) long
B) _2Test
C) 3Dmax
D) A.dat
??
(14) 已知大写字母A的ASCII码值是65,小写字母a的ASCII码是97,则用八进制表示的字符常量‘\101’是( )。
A) 字符A
B)字符a
C)字符e
D)非法的常量
??
(15) 以下非法的赋值语句是( )。
A) n=(i=2,++i);
B)j++;
C) ++(i+1);
D)x=j>0;
??
(16) 设a和b均为double型变量,且a=5.5、b=2.5,则表达式(int)a+b/b的值是( )。
A)6.500000
B)6
C) 5.500000
D) 6.000000
??
(17) 已知i、j、k为int型变量,若从键盘输入:1,2,3,使i的值为1、j的值为2、k的值为3,以下选项中正确的输入语句是( )。
A) scanf(“%2d%2d%2d”,&i,&j,&k);
B) scanf(“%d %d %d”,&i,&j,&k);
C) scanf(“%d,%d,%d”,&i,&j,&k);
D) scanf(“i=%d,j=%d,k=%d”,&i,&j,&k);
??
(18) 与数学式子 对应的C语言表达式是( )。
A) 3*x^n(2*x-1)
B) 3*x**n(2*x-1)
C) 3*pow(x,n)*(1/(2*x-1))
D) 3*pow(n,x)/(2*x-1)
??
(19) 设有定义:long x=-123456L;,则以下能够正确输出变量x值的语句是( )。
A)printf(“x=%d\n”,x);
B) printf(“x=%1d\n”,x);
C)printf(“x=%8dL\n”,x);
D)printf(“x=%LD\n”,x);
??
(20) 若有以下程序:
??main()
??{ int k=2,i=2,m;
??m=(k+=i*=k);printf(“%d,%d\n”,m,i);
??}
??执行后的输出结果是( )。
A) 8,6
B) 8,3
C) 6,4
D) 7,4
??
(21) 已有定义:int x=3,y=4,z=5;,则表达式!(x+y)+z-1 && y+z/2的值是( )。
A) 6
B) 0
C) 2
D) 1
??
(22) 有一函数, ,以下程序段中不能根据x值正确计算出y值的是( )。
A) if(x>0) y=1; B) y=0;
?? else if(x==0) y=0; if(x>0) y=1;
?? else y=-1; else if(x<0) y=-1;
C)y=0; D)if(x>=0)
?? if(x>=0); if(x>0) y=1;
?? if(x>0) y=1 ; else y=0;
?? else y=-1; else y=-1;
??
(23) 以下选项中,与k=n++完全等价的表达式是( )。
A) k=n,n=n+1
B) n=n+1,k=n
C) k=++n
D) k+=n+1
??
(24) 以下程序的功能是:按顺序读入10名学生4门课程的成绩,计算出每位学生的平均分并输出,程序如下:
??main()
??{ int n,k;
??float score ,sum,ave;
??sum=0.0;
??for(n=1;n<=10;n++)
??{ for(k=1;k<=4;k++)
??{ scanf(“%f”,&score); sum+=score;}
??ave=sum/4.0;
??printf(“NO%d:%f\n”,n,ave);
?? }
??}
??上述程序运行后结果不正确,调试中发现有一条语句出现在程序中的位置不正确。这条语句是( )。
A) sum=0.0;
B) sum+=score;
C) ave=sun/4.0;
D) printf(“NO%d:%f\n”,n,ave);
??
(25) 有以下程序段
??int n=0,p;
??do{scanf(“%d”,&p);n++;}while(p!=12345 &&n<3);
??此处do—while循环的结束条件是( )。
A) P的值不等于12345并且n的值小于3
B) P的值等于12345并且n的值大于等于3
C) P的值不等于12345或者n的值小于3
D) P的值等于12345或者n的值大于等于3
??
(26) 有以下程序
??main()
??{ int a=15,b=21,m=0;
??switch(a%3)
??{ case 0:m++;break;
??case 1:m++;
?? switch(b%2)
??{ default:m++;
??case 0:m++;break;
??}
??}
??printf(“%d\n”,m);
??}
?? 程序运行后的输出结果是( )。
A) 1
B) 2
C) 3
D) 4
??
(27) C语言中,函数值类型的定义可以缺省,此时函数值的隐含类型是( )。
A) void
B) int
C) float
D) double
??
(28) 若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是( )。
A) p=q;
B) *p=*q;
C) n=*q;
D) p=n;
??
(29) 有以下程序
??float fun(int x,int y)
??{ return(x+y); }
??main()
??{ int a=2,b=5,c=8;
??printf(“%3.0f\n”,fun(int)fun(a+c,b),a-c));
??}
??程序运行后的输出结果是( )。
A) 编译出错
B) 9
C) 21
D) 9.0
??
(30) 有以下程序
??void fun(char *c,int d)
??{ *c=*c+1;d=d+1;
??printf(“%c,%c,”,*c,d);
??}
??main()
??{ char a=’A’,b=’a’;
??fun(&b,a); printf(“%c,%c\n”,a,b);
??}
??程序运行后的输出结果是( )。
A)B,a,B,a
B) a,B,a,B
C) A,b,A,b
D) b,B,A,b
??
(31) 以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序
??void sort(int a[],int n)
{ int i,j,t;
for(i=0;i
for(j=i+1,j
if(a[i]
}
main()
{ int aa[10]={1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i=o;i<10;i++) print(“%d,”,aa[i]);
printf(‘\n”);
}
??程序运行后的输出结果是( )。
A)1,2,3,4,5,6,7,8,9,10
B) 10,9,8,7,6,5,4,3,2,1,
C) 1,2,3,8,7.6.5.4.9,10
D) 1,2,10,9,8,7,6,5,4,3
??
(32) 有以下程序
??int f(int n)
??{ if (n==1) return 1;
??else return f(n-1)+1;
??}
??main()
??{ int i,j=0;
??for(i=i;i<3;i++) j+=f(i);
??printf(“%d\n”,j);
??}
??程序运行后的输出结果是( )。
A) 4
B) 3
C) 2
D) 1
??
(33) 有以下程序
??main()
??{ char a[ ]={‘a’,‘b’,‘c’,‘d’, ‘e’, ‘f’, ‘g’,‘h’,‘\0’}; int i,j;
??i=sizeof(a); j=strlen(a);
??printf(“%d,%d\b”i,j);
??}
??程序运行后的输出结果是( )。
A)9,9
B)8,9
C)1,8
D)9,8
??
(34) 以下程序中函数reverse的功能是将a所指数组中的内容进行逆置。
??void reverse(int a[ ],int n)
??{ int i,t;
??for(i=0;i??{ t=a[i]; a[i]=a[n-1-i];a[n-1-i]=t;}
??}
??main()
??{ int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;
?? reverse(b,8);
?? for(i=6;i<10;i++) s+=b[i];
?? printf(“%d\n”,s);
??}
??程序运行后的输出结果是( )。
A) 22
B) 10
C) 34
D) 30
??
(35) 有以下程序
??main()
??{ int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}};
??int i,s=0
??for(i=0;i<4;i++) s+=aa[i][1];
??printf(“%d\n”,s);
??}
??程序运行后的输出结果是( )。
A) 11
B) 19
C) 13
D) 20
??
(36) 有以下程序
??#include
??main()
??{ char *p=“abcde\Ofghjik\0”;
??printf(“%d\n”,strlen(p));
??}
??程序运行后的输出结果是( )。
A) 12
B) 15
C) 6
D) 5
??
(37) 程序中头文件typel.h 的内容是:
??#define N 5
??#define M1 N*3
??程序如下:
??#define “type1.h”
??#define M2 N*2
??main()
??{ int i;
??i=M1+M2; printf(“%d\n”,i);
??}
??程序编译后运行的输出结果是:( )。
A) 10
B) 20
C) 25
D) 30
??
(38) 有以下程序
??#include
??main()
??{ FILE *fp; int i=20,j=30,k,n;
??fp=fopen(“d1.dat”“w”);
??fprintf(fp,“%d\n”,i);fprintf(fp,“%d\n”j);
??fclose(fp);
??fp=fopen(“d1.dat”, “r”);
??fp=fscanf(fp,“%d%d”,&k,&n); printf(“%d%d\n”,k,n);
??fclose(fp);
??}
??程序运行后的输出结果是( )。
A) 20 30
B) 20 50
C) 30 50
D) 30 20
??
(39) 以下叙述中错误的是( )。
A) 二进制文件打开后可以先读文件的末尾,而顺序文件不可以
B) 在程序结束时,应当用fclose函数关闭已打开的文件
C) 在利用fread函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据
D) 不可以用FILE定义指向二进制文件的文件指针
(40) 有以下程序
??#include
??main(int argc,char *argv[])
??{ int i,len=0;
??for(i=1;i??printf(“%d\n”,len);
??}
??程序编译连接后生成的可执行文件是ex1.exe,若运行时输入带参数的命令行是:
??ex1 abcd efg 10
??则运行的结果是:( )。
A) 22
B) 17
C) 12
D) 9
??
(41) 有以下程序
??int fa(int x)
??{ return x*x; }
??int fb(int x)
??{ return x*x*x; }
??int f(int (*f1)(),int (*f2)(),int x)
??{ return f2(x)-f1(x); }
??main()
??{ int i;
??i=f(fa,fb,2); printf(“%d\n”,i);
??}
??程序运行后的输出结果是( )。
A) -4
B) 1
C) 4
D) 8
??
(42) 有以下程序
??int a=3;
??main()
??{ int s=0;
??{ int a=5; s+=a++; }
??s+=a++;printf(“%d\n”,s);
??}
??程序运行后的输出结果是( )。
A) 8
B) 10
C) 7
D) 11
??
(43) 有以下程序
??void ss(char *s,char t)
??{ while(*s)
??{ if(*s==t) *s=t-‘a’+’A’;
?? s++;
??}
??}
??main()
??{ char str1[100]=“abcddfefdbd”,c=’d’;
??ss(str1,c); printf(“%s\n”,str1);
??}
??程序运行后的输出结果是( )。
A) ABCDDEFEDBD
B) abcDDfefDbD
C) abcAAfefAbA
D) Abcddfefdbd
??
(44) 有以下程序
??struct STU
??{ char num[10]; float score[3]; };
??main()
??{ struct stu s[3]={{“20021”,90,95,85},
??{“20022”,95,80,75},
??{“20023”,100,95,90}},*p=s;
??int i; float sum=0;
??for(i=0;i<3,i++)
??sum=sum+p->score[i];
??printf(“%6.2f\n”,sum);
??}
??程序运行后的输出结果是( )。
A) 260.00
B) 270.00
C) 280.00
D) 285.00
??
(45) 设有如下定义:
??struck sk
??{ int a;
??float b;
??}data;
??int *p;
??若要使P指向data中的a域,正确的赋值语句是( )。
A) p=&a;
B) p=data.a;
C) p=&data.a;
D) *p=data.a;
??
(46) 有以下程序
??#include
??struct NODE
??{ int num; struct NODE *next; };
??main()
??{ struct NODE *p,*Q,*R;
??p=(struct NODE*)malloc(sizeof(struct NODE));
??q=(struct NODE*)malloc(sizeof(struct NODE));
??r=(struct NODE*)malloc(sizeof(struct NODE));
??p->num=10; q->num=20; r->num=30;
??p->next=q;q->next=r;
??printf(“%d\n”,p->num+q->next->num);
??}
??程序运行后的输出结果是( )。
A) 10
B) 20
C) 30
D) 40
??
(47) 若有以下说明和定义
??typedef int *INTEGER;
??INTEGER p,*q;
??以下叙述正确的是( )。
A) P是int型变量
B) p是基类型为int的指针变量
C) q是基类型为int的指针变量
D) 程序中可用INTEGER代替int类型名
??
(48) 有以下程序
??main()
??{ unsigned char a,b,c;
??a=0x3; b=a|0x8; c=b<<1;
??printf(“%d%d\n”,b,c);
??}
??程序运行后的输出结果是( )。
A) –11 12
B) –6 –13
C) 12 24
D) 11 22
??
(49) 有以下程序
??#include
??main()
??{ char *p,*q;
??p=(char*)malloc(sizeof(char)*20); q=p;
??scanf(“%s%s”,p,q); printf(“%s%s\n”,p,q);
??}
??若从键盘输入:abc def,则输出结果是:( )。
A) def def
B) abc def
C) abc d
D) d d
??
(50) 以下程序中函数f的功能是将n个字符串按由大到小的顺序进行排序。
??#include
??void f(char p[][10],int n)
??{ char t[20]; int i,j;
??for(i=0;i??for(j=i+1;j??if(strcmp(p[i],p[j])<0)
?? { strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);}
??}
??main()
??{ char p[][10]={“abc”,“aabdfg”,“abbd”,“dcdbe”,“cd”};int i;
??f(p,5); printf(“%d\n”,strlen(p[0]));
??}
??程序运行后的输出结果是( )。
A) 6
B) 4
C) 5
D) 3
??
二、填空题(每空2分,共40分)
请将答案分别写在答题卡中序号为【1】至【20】的横线上,答在试卷上不得分。
??
1、计算机软件分为系统软件和应用软件,操作系统属于 [1] 。
??
2、在DOS环境下,代表键盘和显示器的设备文件名为 [2] 。
??
3、支持Internet基本服务的协议是 [3] 。
??
4、从Windows环境进入MS-DOS方式后,返回Windows环境的DOS命令为 [4] 。
??
5、某微型机的运算速度为2MIPS,则该微型机每秒执行 [5] 条指令。
??
6、设有定义:int n,*k=&n;以下语句将利用指针变量k读写变量n中的内容,请将语句补充完整。
??scanf(“%d, ” [6] );
??printf(“%d\n”, [7] 。);
??
7、以下程序运行后的输出结果是 [8] 。
?? main()
??{ int x=10,y=20,t=0;
??if(x==y)t=x;x=y;y=t;
??printf(“%d,%d \n”,x,y);
??}
??
8、以下程序运行后的输出结果是 [9] 。
??main()
??{ int x=15;
??while(x>10 && x<50)
??{ x++;
??if(x/3){x++;break;}
??else continue;
??}
??printf(“%d\n”,x);
??}
??
9、有以下程序:
??#include
??main()
??{ char c;
??while((c=getchar( ))!=’?’) putchar(--c);
??}
??程序运行时,如果从键盘输入:Y?N?,则输出结果为 [10] 。
??
10、以下程序运行后的输出结果是 [11] 。
??void fun(int x,int y)
??{ x=x+y;y=x-y;x=x-y;
??printf(“%d,%d,”,x,y); }
??main()
??{ int x=2,y=3;
??fun(x,y);
??printf(“%d,%d\n”,x,y);
??}
??
11、以下函数的功能是计算s=1+ + +……+ ,请填空。
??double fun(int n)
??{ double s=0.0,fac=1.0; int i;
??for(i=1,i<=n;i++)
??{ fac=fac [12] ;
??s=s+fac;
??}
??return s;
??}
??
12 fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回。请填空。
??#include
??#define N 100
??int fun(int(*a)[N])
??{ int row,col,max,min;
??for(row=0;row??{ for(max=a[row][0],col=1;col??if( [13] )max=a[row][col];
?? if( row==0)min=max;
?? else if( [14] )min=max;
?? }
??return min;
??}
??
13、函数sstrcmp()的功能是对两个字符串进行比较。当s所指字符串和t所指字符串相等时,返回值为0;当s所指字符串大于t所指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数strcmp())。请填空。
??#include
??int sstrcmp(char *s,char *t)
??{ while(*s&&*t&& *s== [15] )
??{ s++;t++;}
??return [16] ;
??}
??
14、下面程序的运行结果是 [17] 。
??#define N 10
??#define s(x) x*x
??#define f(x) (x*x)
??main()
??{ int i1,i2;
??i1=1000/s(N); i2=1000/f(N);
??printf(“%d %d\n”,i1,i2);
??}
??
15、下面程序的运行结果是: [18] 。
??void swap(int *a,int *b)
??{ int *t;
??t=a; a=b; b=t;
??}
??main()
??{ int x=3,y=5,*p=&x,*q=&y;
??swap(p,q);
??printf(“%d%d\n”,*p,*q);
??}
??
16、下面程序的运行结果是: [19] 。
??typedef union student
??{ char name[10];
??long sno;
??char sex;
??float score[4];
??}STU;
??main()
??{ STU a[5];
??printf(“%d\n”,sizeof(a));
??}
??
(17) 函数sstrcmp()的功能是对两个字符串进行比较。当s 所指字符串和t所指字符相等时,返回值为0;当s所指字符串大于t所指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数strcmp())。请填空。
#include
int sstrcmp(char *s,char *t)
{while(*s&&*t&&*s==【19】)
{s++;t++; }
return 【20】;
}
⑷ linux编译时怎么链接dl文件
有以下步骤:
1.源程序的编译
在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器.
下面
我们以一个实例来说明如何使用gcc编译器.
假设我们有下面一个非常简单的源程序(hello.c):
int
main(int
argc,char
**argv)
{
printf("Hello
Linux\n");
}
要编译这个程序,我们只要在命令行下执行:
gcc
-o
hello
hello.c
gcc
编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程
序的输出结果了.命令行中
gcc表示我们是用gcc来编译我们的源程序,-o
选项表示
我们要求编译器给我们输出的可执行文件名为hello
而hello.c是我们的源程序文件.
gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了.
-o选项我们
已经知道了,表示我们要求输出的可执行文件名.
-c选项表示我们只要求编译器输出
目标代码,而不必要输出可执行文件.
-g选项表示我们要求编译器在编译的时候提
供我们以后对程序进行调试的信息.
知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你
想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说
明.
2.Makefile的编写
假设我们有下面这样的一个程序,源代码如下:
⑸ 中如下的编译选项什么意思
1.编译目标文件
icc -c -offload-attribute-target=mic -O3 -openmp -std=c99 -DMKL_ILP64 -I/opt/intel/composer_xe_2013_sp1.1.106/mkl/include fft.c -o fft_new.o
2.连接产生可执行文件
icc fft_new.o -openmp -Wl,--start-group /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_intel_ilp64.a /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_intel_thread.a /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/intel64/libmkl_core.a -Wl,--end-group -Ip-offload-option,mic,compiler,"-Wl,--start-group /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/mic/libmkl_intel_ilp64.a /opt/intel/composer_xe_2013mkl/lib/mic/libmkl_intel_thread.a /opt/intel/composer_xe_2013_sp1.2.144/mkl/lib/mic/libmkl_core.a -Wl,--end-group" -o fft_new.out
这里的东西较多,看上去比较复杂。
1.对于第一步,编译出目标文件。这里面的几个编译选项:
-O3 :表示最大可能优化级别。各种循环优化都执行了,并且各种文件级性质也用来改善性能
-openmp:采用了openmp并行编程
-std=c99:ANSI C是89年成为了标准,被ISO认证。之后99年ISO更新了新的C标准。所以-std用来指明编译的C标准。在某些情况下,如果使用GCC,可能在有冲突的时候使用其他标准,比如:-std=gnu89
-DMKL_ILP64:这个是intel提供的编译选项,主要是一个平台的指示。
-I:指定头文件目录
-o:重命名。
2.对于第二步,链接过程。其中几个编译选项:
-openmp:同上
-Wl:Wl选项告诉编译器将后面的参数传递给链接器。
--start-group 和--stop-group:库文件参数传递的开始和结束。
--offload-option,mic:使用offload方式使用协处理器进行运算
转自CSDN社区beglorious的专栏
⑹ noexecstack编译选项作用
该保护作用于链接阶段,所以需要把参数传递给链接器。 使用-Wl,
_褂酶袷轿?-Wl, -z noexecstack 选项。可用于动态库、ELF格式的可执行文件。
_饔迷恚菏紫龋撼迩绯龀晒_蠖际峭ü葱_hellcode来达到攻击目的的, 而shellcode基本都是放到缓冲区中,只要操作系统限制了堆栈内存区域不可执行状态就可以,一旦被攻击就报错并返回。
⑺ 如何用命令行编译链接c++
打开“开发人员命令提示”。
在命令提示符下,请创建源文件的目录并使其成为当前工作目录。例如,键入md c:simple并按 Enter 以创建名为 Simple 的目录,然后键入cd c:simple并按 Enter 以更改到此目录。
在命令提示符下,键入notepad并按 Enter。
在记事本中,输入下列各行。
在菜单栏上,依次选择“文件”、“保存”以打开“另存为”对话框。导航至已创建的目录。在“文件名”框中,输入源文件的名称(例如 simple.c),然后在“保存类型”下拉列表中,选择“所有文件(*.*)”。选择“保存”按钮以在工作目录中创建 C 源文件。
在命令提示符下,输入dir并按 Enter。你应该看到所创建的源文件
在命令提示符下,指定cl命令和源文件的名称(例如cl simple.c),然后按 Enter 编译此程序。cl.exe 编译器将生成一个包含已编译代码的 .obj 文件,然后运行链接器以生成具有源文件名称的可执行程序,但会具有 .exe 文件名扩展(例如 simple.exe)。
⑻ vc的各编译选项都是什么意思
VC编译选项
/Od 禁用优化(默认值) disable optimizations (default)
/Ox 最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)
/Og 启用全局优化 enable global optimization
/Oy[-] 启用框架指针省略 enable frame pointer omission
/Oi 启用内建函数 enable intrinsic functions
-代码生成-
/G3 为 80386 进行优化 optimize for 80386
/G4 为 80486 进行优化 optimize for 80486
/GR[-] 启用 C++ RTTI enable C++ RTTI
/G5 为 Pentium 进行优化 optimize for Pentium
/G6 为 Pentium Pro 进行优化 optimize for Pentium Pro
/GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)
/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
/GD 为 Windows DLL 进行优化 optimize for Windows DLL
/GB 为混合模型进行优化(默认) optimize for blended model (default)
/EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH
/Gd __cdecl 调用约定 __cdecl calling convention
/EHc extern“C”默认为 nothrow extern "C" defaults to nothrow
/Gr __fastcall 调用约定 __fastcall calling convention
/Gi[-] 启用增量编译 enable incremental compilation
/Gz __stdcall 调用约定 __stdcall calling convention
/Gm[-] 启用最小重新生成 enable minimal rebuild
/GA 为 Windows 应用程序进行优化 optimize for Windows Application
/Gf 启用字符串池 enable string pooling
/QIfdiv[-] 启用 Pentium FDIV 修复 enable Pentium FDIV fix
/GF 启用只读字符串池 enable read-only string pooling
/QI0f[-] 启用 Pentium 0x0f 修复 enable Pentium 0x0f fix
/Gy 分隔链接器函数 separate functions for linker
/GZ 启用运行时调试检查 enable runtime debug checks
/Gh 启用钩子函数调用 enable hook function call
/Ge 对所有函数强制堆栈检查 force stack checking for all funcs
/Gs[num] 禁用堆栈检查调用 disable stack checking calls
-输出文件-
/Fa[file] 命名程序集列表文件 name assembly listing file
/Fo 命名对象文件 name object file
/FA[sc] 配置程序集列表 configure assembly listing
/Fp 命名预编译头文件 name precompiled header file
/Fd[file] 命名 .PDB 文件 name .PDB file
/Fr[file] 命名源浏览器文件 name source browser file
/Fe 命名可执行文件 name executable file
/FR[file] 命名扩展 .SBR 文件 name extended .SBR file
/Fm[file] 命名映射文件 name map file
-预处理器-
/FI 命名强制包含文件 name forced include file
/C 不吸取注释 don't strip comments
/U 移除预定义宏 remove predefined macro
/D{=|#} 定义宏 define macro
/u 移除所有预定义宏 remove all predefined macros
/E 将预处理定向到标准输出 preprocess to stdout
/I 添加到包含文件的搜索路径 add to include search path
/EP 将预处理定向到标准输出,不要带行号 preprocess to stdout, no #line
/X 忽略“标准位置” ignore "standard places"
/P 预处理到文件 preprocess to file
-语言-
/Zi 启用调试信息 enable debugging information
/Zl 忽略 .OBJ 中的默认库名 omit default library name in .OBJ
/ZI 启用调试信息的“编辑并继续”功能 enable Edit and Continue debug info
/Zg 生成函数原型 generate function prototypes
/Z7 启用旧式调试信息 enable old-style debug info
/Zs 只进行语法检查 syntax check only
/Zd 仅要行号调试信息 line number debugging info only
/vd{0|1} 禁用/启用 vtordisp disable/enable vtordisp
/Zp[n] 在 n 字节边界上包装结构 pack structs on n-byte boundary
/vm 指向成员的指针类型 type of pointers to members
/Za 禁用扩展(暗指 /Op) disable extensions (implies /Op)
/noBool 禁用“bool”关键字 disable "bool" keyword
/Ze 启用扩展(默认) enable extensions (default)
- 杂项 -
/?, /help 打印此帮助消息 print this help message
/c 只编译,不链接 compile only, no link
/W 设置警告等级(默认 n=1) set warning level (default n=1)
/H 最大化外部名称长度 max external name length
/J 默认 char 类型是 unsigned default char type is unsigned
/nologo 取消显示版权消息 suppress right message
/WX 将警告视为错误 treat warnings as errors
/Tc 将文件编译为 .c compile file as .c
/Yc[file] 创建 .PCH 文件 create .PCH file
/Tp 将文件编译为 .cpp compile file as .cpp
/Yd 将调试信息放在每个 .OBJ 中 put debug info in every .OBJ
/TC 将所有文件编译为 .c compile all files as .c
/TP 将所有文件编译为 .cpp compile all files as .cpp
/Yu[file] 使用 .PCH 文件 use .PCH file
/V 设置版本字符串 set version string
/YX[file] 自动的 .PCH 文件 automatic .PCH
/w 禁用所有警告 disable all warnings
/Zm 最大内存分配(默认为 %) max memory alloc (% of default)
-链接-
/MD 与 MSVCRT.LIB 链接 link with MSVCRT.LIB
/MDd 与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib
/ML 与 LIBC.LIB 链接 link with LIBC.LIB
/MLd 与 LIBCD.LIB 调试库链接 link with LIBCD.LIB debug lib
/MT 与 LIBCMT.LIB 链接 link with LIBCMT.LIB
/MTd 与 LIBCMTD.LIB 调试库链接 link with LIBCMTD.LIB debug lib
/LD 创建 .DLL Create .DLL
/F 设置堆栈大小 set stack size
/LDd 创建 .DLL 调试库 Create .DLL debug libary
/link [链接器选项和库] [linker options and libraries]
⑼ 求gcc编译与链接选项参数介绍的资料
为了提高程序的性能,根据自己的cpu型号选定合适的优化参数,上面的是经过测试比较合理的编译参数。实际情况和性能优化还有待于你自己测试一下才知道:)
⑽ Dev c++中的链接问题
devcpp使用的是gcc编译器,它编译程序时,默认没有添加GetStockObject函数对应的库,你要在Devcpp的编译选项里添加一个连接选项-mwindows 才行,具体添加的地方你可以看我的截图。
打开DEVCPP,在菜单中单击“工具”选项,然后单击编译选项,然后把下面的复选框“连接命令行加入以下命令”打钩,最后在编辑框输入-mwindows,把这个库添加进去。
按了确定然后编译程序一般没问题,有问题欢迎继续提问。