gcc编译动态库和静态库

本文详细介绍了GCC编译器的基本概念及其常用选项,包括预编译、汇编、编译和链接过程。同时,讲解了如何创建动态库和静态库,以及在编译时使用动态库和静态库的选项。此外,还讨论了预编译头文件、链接库和调整输出文件名的方法。最后,通过实例展示了如何将函数封装到动态库和静态库,并在主程序中调用。
摘要由CSDN通过智能技术生成

gcc常见选项和动态库静态库

一、gcc概述

  • 编译器(Compiler)把源代码转换成其他的更低级的代码(例如二进制码、机器码),但是不会执行它。
  • 解释器(Interpreter)会读取源代码,并且直接生成指令让计算机硬件执行,不会输出另外一种代码
  • gcc最开始是作为C语言的编译器,但后来功能得到扩展,变得能够支持编译更多的语言,例如C++、Java、Go、Objective -C等,所以后来gcc又改名为GNU编译器套件(GNU Compiler Collection 编译器集合)。
  • gcc在编译过程中是根据文件后缀名的不同来调用不同编译器的
  • .c文件生成可执行文件需要经过四个步骤预编译、汇编、编译、链接

二、gcc常见选项

test.c

#include <stdio.h>

int main(int argc, char *argv[])
{
 	printf("Hello world!\n");

    return 0;
}
  1. -E :预编译 gcc -E test.c

    执行到预编译,进行代码文本的替换操作。输出预编译结果到标准输出(一般是显示器)

在这里插入图片描述

  1. -S :汇编 gcc -S test.c

    执行到汇编,进行源代码到汇编代码的转换,输出汇编代码(.s文件)

在这里插入图片描述

  1. -c :编译 gcc -c test.c

    执行到编译,输出目标文件(.o文件)

在这里插入图片描述
在这里插入图片描述

  1. -o :更改gcc输出的文件名

如果想要使用gcc生成可执行文件,可以直接gcc test.o生成可执行文件a.outgcc test.o -o test则可以重命名生成的可执行文件a.out为我们指定的test(从.o文件到可执行文件的过程实际是链接的过程)在这里插入图片描述

  1. -shared与-fPIC:创建动态库
    -fPIC:(Position-Independent Code)它作用于编译阶段,告诉编译器要生成与位置无关的代码(.o文件)

    -shared:将多个.o文件链接成一个.so动态库文件

​ 现在将打印”Hello world!“的功能封装成一个函数,并将hello.c分别制作成动态库和静态库,在test.c的main()中调用静态库或动态库里的hello()来打印“Hello world!”

hello.h

#ifndef _HELLO_H_ //防卫式的声明
#define _HELLO_H_

extern int hello();

#endif

hello.c

#include <stdio.h>

int hello()
{
	printf("Hello world!\n");

	return 0;
}

test.c

#include <stdio.h>
#include "hello.h"

int main(int argc, char *argv[])
{
	hello();

return 0;
}

在这里插入图片描述

  1. -I(大写的i):向gcc中加入头文件搜索路径
    在这里插入图片描述
  2. -l(小写的L):指定需要链接的库
  3. -L:向gcc中加入库路径

在这里插入图片描述
动态链接在运行时需要export 引入动态库路径到查找路径来进行链接,而静态链接则不需要
在这里插入图片描述
9. -static:链接静态库

在这里插入图片描述在这里插入图片描述

  1. -w:关闭警告
  2. -Wall:开启所有警告
  3. -g:产生带有调试信息的目标代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值