Linux中GCC的简单使用

本文详细介绍了如何在Linux中使用GCC生成和使用静态库(.a)和动态库(.so)。从创建.h、.c、.o文件开始,通过ar命令创建静态库,然后在程序中引用并编译运行。接着,利用gcc创建动态库,处理动态链接时的路径问题。此外,文章还讨论了GCC编译器背后的预处理、编译、汇编和链接过程,以及nasm编译器的使用和curses库在终端程序中的应用。
摘要由CSDN通过智能技术生成

一、用gcc生成静态库和动态库

第1步:编辑生成例子程序hello.h、hello.c和main.c
可以先创建一个目录,保存本次操作的文件。

#mkdir test1
#cd test1

然后用vim编辑器编辑生成所需的3个文件。
程序1:hello.h

#ifndef HELLO_H 
#define HELLO_H 
void hello(const char *name); 
#endif //HELLO_H

程序2:hello.c

#include <stdio.h>
 void hello(const char *name)
 {
   
      printf("Hello %s!\n", name); 
 }

程序3:main.c

#include "hello.h"
int main() 
{
   
       hello("everyone"); 
       return 0;
}

第2步:将hello.c编译成.o文件。
输入以下命令得到hello.o文件

gcc -c hello.c

我们运用 ls 命令查看是否生成了hello.o文件
在这里插入图片描述
在ls命令结束后,我们看到了hello.c文件,本次操作完成。
下面我们来看看如何创建和使用静态库。
第3步:由.o文件创建静态库
静态库文件名的命名规范是以 lib 为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将 创建的静态库名为 myhello,则静态库文件名就是 libmyhello.a。在创建和使用静态库时, 需要注意这点。创建静态库用 ar 命令。在系统提示符下键入以下命令将创建静态库文件 libmyhello.a。

ar -crv libmyhello.a hello.o

我们同样运行ls命令查看结果:
在这里插入图片描述
可以看到ls命令结果中有libmyhello.a。
第4步:在程序中使用静态库。
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包 含这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明静态库名,gcc 将会从 静态库中将公用函数连接到目标文件中。注意,gcc 会在静态库名前加上前缀 lib,然后追加扩展名.a 得到的静态库文件名来查找静态库文件。
在程序 3:main.c 中,我们包含了静态库的头文件 hello.h,然后在主程序 main 中直接调用公用函数 hello。下面先生成目标程序 hello,然后运行 hello 程序看看结果如何。
方法一:

gcc -o hello main.c -L. –lmyhello 

自定义的库时,main.c 还可放在-L.和 –lmyhello 之间,但是不能放在它俩之后,否则会提示 myhello 没定义,但是是系统的库时,如 g++ -o main(-L/usr/lib) -lpthread main.cpp 就不出错。
方法二:

gcc main.c libmyhello.a -o hello

方法三:
先生成main.o:

 gcc -c main.c 

再生成可执行文件:

gcc -o hello main.o libmyhello.a 

动态库连接时也可以这样做。
我使用方法二得到结果如下:
在这里插入图片描述
我们试试hello能否运行:
在这里插入图片描述
可以看到程序运行正常。
我们删除静态库文件试试公用函数hello是否真的连接到目标文件hello中了。
在这里插入图片描述
可以看到程序照常运行,静态库中的公用函数已经连接到目标文件hello中了。
第5步:由.o文件创建动态库文件。
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其 文件扩展名为.so。例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyh ello.so。用 gcc 来创建动态库。
在系统提示符下键入以下命令(命令中-o不可少)得到动态库文件libmyhello.so。

gcc -shared -fPIC -o libmyhello.so hello.o

我们照样用ls命令查看动态文件是否生成。
在这里插入图片描述
第6步:在程序中使用动态库。
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含 这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。我 们先运行 gcc 命令生成目标文件,再运行它看看结果。

gcc main.c libmyhello.so -o hello1

我们用ls命令查看是否生成了文件:
在这里插入图片描述
下面我们运行一下这个程序:
在这里插入图片描述
可以看到提示出现了错误,原来是找不到动态库文件libmyhello.so。程序运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件libmyhello.so复制到目录/usr/lib中,再试试。
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值