ubantu可执行程序的组装


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

(1)编辑生成程序 hello.h、hello.c 和 main.c
在这里插入图片描述
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 文件
输入如下命令

# gcc -c hello.c

利用ls命令进行查看是否生成了 hello.o 文件

在这里插入图片描述

`(3) 由.o 文件创建静态库
输入如下命令

# ar -crv libmyhello.a hello.o

利用ls命令进行查看是否生成了 libmyhello.a 文件在这里插入图片描述

(4) 在程序中使用静态库
输入如下命令

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

显示如下:在这里插入图片描述
这是因为自定义的库时,并非系统的库。
再输入如下命令

#gcc main.c libmyhello.a -o hello
# ./hello

显示如下:
在这里插入图片描述
或者输入如下命令:
先生成 main.o:

gcc -c main.c

再生成可执行文件:

gcc -o hello main.o libmyhello.a
# ./hello

显示如下:
在这里插入图片描述
删除静态库文件验证公用函数 hello 是否真的连接到目标文件 hello 中,过程如下:
输入如下命令

# rm libmyhello.a rm: remove regular file `libmyhello.a'? y # ./hello

在这里插入图片描述
(5) 由.o 文件创建动态库文件
输入如下命令

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

在这里插入图片描述
由于本人用的是ubuntu16,从hello.c 生成 hello.o,需要将 gcc -c hello.c 换成 gcc -fpic -c hello.c之后才不会出错,如下:
在这里插入图片描述
(6)在程序中使用动态库

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

在这里插入图片描述
此时出错提示找不到动态库文件 libmyhello.so
解决方法是将文件 libmyhello.so 复制到目录/usr/lib 中再来一次,如下:在这里插入图片描述此时需要管理员权限,即需要输入密码即可。

(7)当静态库和动态库同名时验证GCC使用静态库还是动态库如下:
先删除除.c 和.h 外的所有文件,再输入命令

在这里插入图片描述此时需要管理员权限,即需要输入密码即可。

再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so

# gcc -c hello.c
# ar -cr libmyhello.a hello.o 
# gcc -shared -fPIC -o libmyhello.so hello.o 

运行 gcc 命令来使用函数库 myhello 生成目 标文件 hello,并运行程序 hello
输入命令

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

显示如下:
在这里插入图片描述
此时所遇到的问题解决方法与上一步第六步相同,不再赘述。

二、静态库.a与.so库文件的生成与使用

(1)编辑生成所需要的四个文件 A1.c 、 A2.c、 A.h、 test.c
在这里插入图片描述
A1.c:

#include <stdio.h> 
void print1(int arg)
{ printf("A1 print arg:%d\n",arg); }

A2.c:

#include <stdio.h> 
void print2(char *arg)
{ printf("A2 printf arg:%s\n", arg); }

A.h:

#ifndef A_H 
#define A_H 
void print1(int); 
void print2(char *); 
#endif

test.c:

#include <stdlib.h>
#include "A.h" 
int main()
{ print1(1); print2("test"); exit(0); }

(2) 静态库.a 文件的生成与使用
生成目标文件(xxx.o)

# gcc -c A1.c A2.c

显示如下:
在这里插入图片描述
生成静态库.a 文件

# ar crv libafile.a A1.o A2.o

显示如下:
在这里插入图片描述
使用.a 库文件,创建可执行程序

# gcc -o test test.c libafile.a
#./test

显示如下:
在这里插入图片描述
(3)共享库.so 文件的生成与使用
生成目标文件(hello.o)

# gcc -fpic -c hello.c
# gcc -c -fpic A1.c A2.c

显示如下:
在这里插入图片描述
生成共享库.so 文件

# gcc -shared -fpic -o  libsofile.so A1.o A2.o

使用.so 库文件,创建可执行程序

# gcc -o test test.c libsofile.so
# ./test

显示如下:
在这里插入图片描述
出现错误,是找不到对应的.so 文件
运行 ldd test,查看链接情况

# ldd test

显示如下:在这里插入图片描述
此时需将对应 so 文件拷贝到对应路径

sudo cp libsofile.so /usr/lib

显示如下:
在这里插入图片描述

三、自主设计一个库的链接

(1)编辑生成所需要的四个g文件 sub1.c 、 sub2.c、 sub1.h、 main1.c在这里插入图片描述
sub1.c:

#include"sub1.h"
float x2x(int a,int b)
{
return a+b;
}

sub2.c:

#include"sub1.h"
float y2y(int a,int b)
{
return a*b;
}

sub1.h:

float x2x(int a,int b);
float y2y(int a,int b);

main1.c:

int main()
{
int a,b;  
float c,d;
a=1;
b=2;
c=x2x(a,b); //调用自定义头文件里的x2x函数
d=y2y(a,b); //调用自定义头文件里的y2y函数
printf("%f\n%f\n",c,d);
}

(2) 静态库.a 文件的生成与使用
生成目标文件(sub1.o、sub2.o)

# gcc -c sub1.c sub2.c

显示如下:在这里插入图片描述
生成静态库.a 文件

# ar crv libsubfile.a sub1.o sub2.o

显示如下:
在这里插入图片描述
使用.a 库文件,创建可执行程序

# gcc -o main1 main1.c libsubfile.a
#./main1

显示如下:
在这里插入图片描述
此时查看文件大小,显示如下:
在这里插入图片描述
(3)共享库.so 文件的生成与使用
生成目标文件(main1.o)

# gcc -fpic -c main1.c
# gcc -c -fpic sub1.c sub2.c

显示如下:在这里插入图片描述
生成共享库.so 文件

# gcc -shared -fpic -o  libsubfile.so sub1.o sub2.o

使用.so 库文件,创建可执行程序

# gcc -o main1 main1.c libsubfile.so
# ./main1

显示如下:
在这里插入图片描述
此时查看文件大小,显示如下:
在这里插入图片描述

总结

本篇文章主要介绍了简单的ubantu下库文件的生成与使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值