gcc的使用以及静态库和动态库的制作【掘金日新计划】

85 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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后面接的命令和静态库的制做

此处用到的文件如下

微信截图_20221121211824.png
代码如下

// 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/   // 也可以一个一个的转

微信截图_20221121212329.png

ar rcs: 将.o文件打包

ar rcs libMyCalc.a *.o  //把所有 *.o文件打包成libMyCalc.a
                        // 静态库文件一般命名为 libXXX.a
nm libMyCalc.a  //查看库文件内容

1.png

使用静态库

// -L 库所在的目录 
// -l 库的名字
gcc main.c -o app -I ./include/ -L ./lib/ -l MyCalc