1、linux C- gdb调试、Makefile
gcc可以编译c, c++, object-c, java等众多的语言程序
g++则是专注于C和C++。
gdb调试
GDB 调试器是一个功能强大的工具,它可以做很多的调试工作,如断点,单步跟踪等。
相关命令:
下面演示两个例子,追踪快速排序的过程和查看优化后的gcd()算法(方法来自编程之美)
观察快速排序:
打印数组,查看快速排序中各个元素的位置变化
源码:
#include
2、 partion(int a[],int start,int end){
int i=start,j=end;
int temp=a[start];
while(i 3、turn i;
}
void Qsort(int a[],int start,int end){
if(start 4、intf("\n");
return 0;
}
指令:
edemon@linux:~$ g++ -g -o exe main.cpp
edemon@linux:~$ gdb exe
(gdb) break 17
Breakpoint 1 at 0x4006f4: file main.cpp, line 17.
(gdb) run
Breakpoint 1, Qsort (a=0x7fffffffdda0, start=0, end=9) at main.cpp:17
17 if(start 5、3, 2, 7, 5, 1, 0, 9, 6, 4, 11}
(gdb) continue
Breakpoint 1, Qsort (a=0x7fffffffdda0, start=0, end=3) at main.cpp:17
17 if(start 6、17 if(start 7、 Qsort (a=0x7fffffffdda0, start=1, end=2) at main.cpp:17
17 if(start 8、9, 6, 4, 11}
(gdb) continue
Continuing.
Breakpoint 1, Qsort (a=0x7fffffffdda0, start=2, end=2) at main.cpp:17
17 if(start 9、 if(start 10、rt (a=0x7fffffffdda0, start=4, end=5) at main.cpp:17
17 if(start 11、 6, 7, 11}
(gdb) continue
Continuing.
Breakpoint 1, Qsort (a=0x7fffffffdda0, start=5, end=5) at main.cpp:17
17 if(start 12、 if(start 13、rt (a=0x7fffffffdda0, start=6, end=7) at main.cpp:17
17 if(start 14、 7, 9, 11}
(gdb) continue
Continuing.
Breakpoint 1, Qsort (a=0x7fffffffdda0, start=7, end=7) at main.cpp:17
17 if(start 15、 if(start 16、1
[Inferior 1 (process 7467) exited normally]
计算24, 26的最大公约数:
使用gdb查看递归情况,a和b是怎样变化的。
源码:
#include 17、swap(a,b);
if(a==0) return b;
if(odd(a) && odd(b)) return gcd(b-a,a);
if(!odd(a) && odd(b)) return gcd(a>>1,b);
if(odd(a) && !odd(b)) return gcd(a,b>>1);
if(!odd(a) && !odd(b)) return gcd(a>>1,b>>1)<<1;
}
int main(){
cout< 18、
$ g++ -g -o exe main.cpp
$ gdb exe
(gdb) run
Breakpoint 1, gcd (a=24, b=26) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=12, b=13) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=6, b=13) at main 19、cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=3, b=13) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=10, b=3) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=3 20、 b=5) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=2, b=3) at main.cpp:10
]10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=1, b=3) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 21、 1, gcd (a=2, b=1) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=1, b=1) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
Breakpoint 1, gcd (a=0, b=1) at main.cpp:10
10 if(a>b) swap(a,b);
(gdb) continue
Continuing.
22、
makefile
Linux中的make工具提供了一种管理工程的功能, 编写Makefile文件,通过make命令将多个文件编译为可执行文件
例如:
main.c
t1.c //output “hello world”
t2.c //output “I’m learning linux c”
action.h
action.h:
#ifdef __ACTION_H__
#define __ACTION_H__
extern void action1();
extern void action2();
#endif
main.c
#in 23、clude "action.h"
int main(){
action1();
action2();
return 0;
}
t1.c:
#include 24、tion.h
gcc -o exe action1.o action2.o main.o
gcc -c -o action1.o t1.c
action1.o:action.h t1.c
action2.o:action.h t2.c
gcc -c -o action2.o t2.c
main.o:ion.h main.c
clean:
rm -f exe action1.o action2.o main.o
edemon@linux:/media/edemon/document/program/prodoc/contest/newpr 25、a/makeFile$ make
gcc -c -o action2.o t2.c
cc -c -o main.o main.c
main.c: In function ‘main’:
main.c:3:5: warning: implicit declaration of function ‘action1’ [-Wimplicit-function-declaration]
action1();
^
main.c:4:5: warning: implicit declaration of function ‘action2’ [-Wimplicit- 26、function-declaration]
action2();
^
gcc -o exe action1.o action2.o main.o
gcc -c -o action1.o t1.c
edemon@linux:/media/edemon/document/program/prodoc/contest/newpra/makeFile$ ls
action1.o action2.o action.h exe main.c main.o Makefile t1.c t2.c
edemon@linux:/media/edemon/document/program/prodoc/contest/newpra/makeFile$ ./exe
hello world
I'm learning linux C
常见问题:
Makefile:2: * missing separator. Stop.
第二行命令缺少tab空格
加tab空格后颜色改变。
make: * No rule to make target ‘action.h’, needed by ‘action1.o’. Stop.
我将头文件放到了/usr/include,事实上那是画蛇添足。只需要将所有的文件放在当前的文件夹下即可。






