可执行程序的组装以及编译器的故事

本文详细介绍了Linux下可执行程序的组装,包括静态库和动态库的生成与使用,以及gcc编译工具的用途。此外,还深入探讨了Curses库,包括主要函数的功能,并演示了在Ubuntu中安装curses库的过程。
摘要由CSDN通过智能技术生成

一、可执行程序的组装

1.用gcc生成静态库和动态库

(1)编译生成子程序 hello.h、hello.c 和 main.c
创建目录:

mkdir test1
cd test1

编译三个程序:
hello.h

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

hello.c

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

main.c

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

(2)将 hello.c 编译成.o 文件
输入命令的得到hello.o 文件

gcc -c hello.c

在这里插入图片描述
(3)由.o 文件创建静态库
输入命令创建静态库文件

ar -crv libmyhello.a hello.o

在这里插入图片描述
(4) 在程序中使用静态库
先生成目标程序hello

gcc main.c libmyhello.a -o hello

在这里插入图片描述

运行 hello 程序

./hello

在这里插入图片描述
删除静态库文件试试公用函数 hello 是否真的连接到目标文件 hello 中

rm libmyhello.a
./hello

在这里插入图片描述
程序照常运行,静态库中的公用函数已经连接到目标文件中了
(5) 由.o 文件创建动态库文件
键入命令得到动态库文件 libmyhello.so

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

直接使用该命令会出现错误,要删除原来的hello.o文件,使用gcc -fpic -c hello.c命令重新生成hello.o文件,再进行动态库文件的创建。
在这里插入图片描述
(6)在程序中使用动态库
输入命令生成目标文件

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

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

sudo mv libmyhello.so /usr/lib

在这里插入图片描述
(7)静态库和动态库同名时,gcc 命令会使用哪个库文件?
先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态

sudo rm -f hello hello.o 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值