1.gcc命令的常用选项:
1)列出这些常用选项的作用:
选项 | 功能 |
---|---|
-o [file] | 指定生成的输出文件名为file |
-E | 只进行预处理 |
-S | 只进行预处理和编译 |
-c | 只进行预处理,编译和汇编 |
-Wall | 生成所有级别的警告信息 |
-w | 关闭所有警告 |
-O[0-3] | 指定编译器优化级别,0为不优化;3优化等级最高 |
-include [file] | 包含一个文件,等同于代码中的#include |
-D[key]=[value] | 添加宏替换,等同于#define key value,若省略def,则表示替换为1 |
-U[key] | 取消宏定义,等同于#undef key |
-v | 显示制作GCC工具时的配置命令,显示预处理器,编译器的版本号 |
-I[dir] | (大写i)将dir目录加入头文件搜索目录列表/优先在dir目录中查找头文件 |
-L[dir] | 将dir目录加入库文件搜索目录列表/优先在dir目录中查找库文件 |
-l[name] | (小写L)链接名为name的库 |
-static | 链接时使用静态库 |
-shared | 编译动态库 |
-g | 在可执行文件中加入标准调试信息 |
2)使用这些选项编译程序:
目录结构:
hello.c
include|->hello.h
代码:
//hello.h
#include<stdio.h>
//hell.c
#include"hello.h"
int main(){
printf("hello\n");
return 0;
}
运行截图:
2.分析静态链接库与动态链接库各自的优缺点
静态链接库:
- 优点:
- 对运行环境的依赖性较小,具有较好的兼容性
- 缺点:
- 生成的程序比较大,需要更多系统资源,在装入内存时会消耗更多的时间
- 库函数有了更新,必须重新编译应用程序
动态链接库
- 优点:
- 在需要的时候猜会调入对应的资源函数
- 简化程序的升级;有较小的程序体积
- 实现进程之间的资源共享(避免重复拷贝)
- 缺点:
- 以来动态库,不能独立运行
- 动态库依赖版本问题严重
3.静态链接库与动态链接库的创建方法和使用方法
测试代码:
//mylib.h
extern int add(int x, int y);
extern int sub(int x, int y);
//mylib.c
int add(int x, int y){
return x+y;
}
int sub(int x, int y){
return x-y;
}
//mytest.c
#include<stdio.h>
#include"mylib.h"
int main(){
int a=20, b=10, sum, diff;
sum = add(a, b);
diff = sub(a,b);
printf("sum=%d\n", sum);
printf("diff=%d\n", diff);
}
静态链接库的创建:
gcc -c mylib.c -o mylib.o
ar rc libmylib.a mylib.o
静态链接库的使用:
gcc -o mytest mytest.c libmylib.a
gcc -o mytest mytest.c -L/opt -lmylib -I/opt
运行截图:
动态链接库的创建:
gcc -shared mylib.c -o libmylib.so
动态链接库的使用:
gcc -o mytest mytest.c ./libmylib.so
gcc -o mytest mytest.c -L./opt -lmylib -I./opt
运行截图:
4.gdb调试程序截图(练习:列出程序清单、运行程序、设置断点、清除断点、显示程序变量值、单步执行)
测试代码:
//gdbtest.c
#include<stdio.h>
int sum(int m);
int main(){
int i, n=0;
sum(50);
for(i=1;i<=50;++i){
n+=i;
}
printf("The sum of 1-50 is %d \n", n);
return 0;
}
int sum(int m){
int i,n=0;
for(i=1;i<=m;++i)
n+=i;
printf("The sum of 1-m is %d\n", n);
}
编译:
gcc -g gdbtest.c -o gdbtest
测试截图: