首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

GCC编译器施用学习笔记(三)

2012-07-08 
GCC编译器使用学习笔记(三)GCC编译器使用学习笔记(三)gcc debuggcc -gcat -n null.c // -n 列出行号int a(

GCC编译器使用学习笔记(三)
GCC编译器使用学习笔记(三)

gcc debug

gcc -g

cat -n null.c // -n 列出行号

int a(int *p);int main(void){  int* p = 0; //0是内核地址  return a(p);}int a(int *p){  int y = *p; //访问内核地址,不允许  return y;}


--进行debug

gcc -Wall -g null.c
//编译语法没有错误

./a.out

ulimit -c

ulimit -c unlimited  //允许产生core dumped

man ulimit

./a.out

ll

gdb a.out core.6363

//查看详细信息
print p

backtrace

cat -n null.c

--优化
debug,不优化
-o0

生产:
-o2

vi test.c
#include<stdio.h>double powern(double d,unsigned n){  double x = 1.0;  unsigned j = 1;  for(;j<=n;j++)  {    x *= d;  }  return x;}int main(void){  double sum = 0.0;  unsigned i=1;  for(;i<=100000000;i++)  {    sum += powern(i,i%5);  }  printf("sum = %g.\n",sum);  return 0;}


不优化
gcc -Wall -o0 test.c -o test
time ./test     //查看指向时间

o1优化
gcc -Wall -o1 test.c -o test01
time ./test01     //查看指向时间

o2优化
gcc -Wall -o2 test.c -o test02

time ./test02     //查看指向时间

o3优化
gcc -Wall -o3 test.c -o test03
time ./test03     //查看指向时间

对循环进行优化
gcc -Wall -o3 -funroll-loops test.c -o test04
time ./test04     //查看指向时间

vi uninit.c
int sign(int x){  int s;  if(x>0)    s = 1;  else if(x<0)    s = -1;  return s;}

//s没有初始化,存在漏洞,-o1 才可以检查出来

gcc -Wall -o1 -c uninit.c

--经典优化
for(i=0;i<n;i++){  y[i]=i;}


优化后:
for(i=0;i<(n%2);i++){  y[i]=i;}for(;i+1<n;i+=2){  y[i] = i;  y[i+1] = i+1;}

减少循环判断次数


--编译c++
g++
which g++:g++编译c++
which gcc: gcc编译c

vi hello.cc

#include<iostream>int main(){  std::cout<<"Hello,world!"<<std::endl;  return 0;}

g++ -Wall hello.c -o hello

//只编译
g++ -Wall -c hello.cc
//连接
g++ hello.o -o hello

--编译器是怎么工作的?
四个步骤:
1.预处理
2.编译
3.汇编
4.链接

vi hello.c
#include<stdio.h>int main(void){  printf("Hello,world!\n");  return 0;}



gcc -Wall hello.c -o hello
分解步骤:

1.预处理
cpp hello.c > hello.i

cat hello.i | more

2.编译成汇编语言
gcc -Wall -S hello.i
cat hello.s

3.汇编产生目标文件
as hello.s -o hello.o

4.链接
gcc hello.o -o hello


--gcc辅助工具
1. file
file hello
file hello.c

ELF:可执行文件
LSB:编译平台

2.ldd:查看依赖的动态库

--gcc优化工具
1.gprof:查看每个函数的执行时间和调用次数

gcc -Wall -pg hello.c -o hello
gprof hello

2.gcov:统计程序每行的执行时间
vi cov.c

#include<stdio.h>int main(void){  int i;  for(i=1;i<10;i++)  {    if(i%3 == 0)         printf("%d is divisible by 3.\n",i);    if(i%11 == 0)         printf("%d is divisible by 11.\n",i);  }}


gcc -Wall -fprofile-arcs -ftest-coverage cov.c -o cov
./cov
gcov cov.c

grep "#####" *.gcov




热点排行