开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
gcc
gcc部分使用的代码以及文件路径如下
#include <stdio.h>
int main(int argc, char *argv[])
{
#ifdef DEBUG
printf("have defined DEBUG\n");
#else
printf("not define DEBUG\n");
#endif
printf("hello\n");
return 0;
}
gcc的工作流程
gcc -E(预处理,头文件展开,宏替换)
gcc -E hello.c -o hello.i //-o: 输出命令
gcc -E hello.c >> hello.i // 等价上面一句
gcc -S(转成汇编代码)
gcc -S hello.i //不需要指定输出,会自动生成hello.s文件
gcc -c(编译成二进制文件)
gcc -c hello.s //自动生成hello.o文件
gcc hello.o
gcc hello.o //生成a.out文件, 可以执行,输入:./a.out
gcc hello.c //等于gcc -E -S -c gcc hello.o
gcc后面接的命令和静态库的制做
此处用到的文件如下
代码如下
// main.c 的内容 =============================================
#include <stdio.h>
#include "head.h"
int main(void)
{
int a=4, b=2;
int c=0;
c=add(a, b);
c=mul(a, b);
printf("c=%d\n", c);
return 0;
}
// head.h ===========================================
#ifndef __HEAD_H_
#define __HEAD_H_
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
#endif
// =============================add.c ===================
#include "head.h"
int add(int a, int b)
{
int result = a + b;
return result;
}
int sub(int a, int b)
{
int result = a - b;
return result;
}
// =============================mul.c =========================
#include "head.h"
int mul(int a, int b)
{
int result = a * b;
return result;
}
// ======================= div.c ===================
#include "head.h"
int div(int a, int b)
{
int result = a / b;
return result;
}
-I :包含的目录
add.c 转成add.o文件
gcc -c add.c // 会报错, 因为add.c里面有#include "head.h"
gcc -c add.c -I ../include/ //需要指定head.h文件的位置
-o: 输出文件
//这里使用的是hello.c的单个文件
gcc hello.c //直接对hello.c使用会默认输出a.out
gcc hello.c -o app //会输出app, app可执行
-D: 在外部编译的时候添加宏定义
#include <stdio.h>
int main(int argc, char *argv[])
{
#ifdef DEBUG //代码中没有写 #define DEBUG 1
//用gcc编译的时候可以向代码添加 #define DEBUG
//添加成功 输出“have defined DEBUG”
printf("have defined DEBUG\n");
#else
printf("not define DEBUG\n");
#endif
printf("hello\n");
return 0;
}
-L:静态库所在的目录
-l: 静态库的名字 (使用实例请拉倒最后)
制作静态库
先把 *.c 文件转成 *.o 文件
gcc -c *.c -I ../include/ //把所有的 .c 转成 .o 文件
gcc -c add.c div.c mul.c -I ../include/ // 也可以一个一个的转
ar rcs: 将.o文件打包
ar rcs libMyCalc.a *.o //把所有 *.o文件打包成libMyCalc.a
// 静态库文件一般命名为 libXXX.a
nm libMyCalc.a //查看库文件内容
使用静态库
// -L 库所在的目录
// -l 库的名字
gcc main.c -o app -I ./include/ -L ./lib/ -l MyCalc