.o和.a和.so

1.编写一个add函数保存在文件add.c中

root@7519ef034539:/home/gaole/Cprogram/myc# cat add.c
#include "add.h"

int add(int x, int y) {
    int sum;

    sum = x + y;
    
    return sum;
}

2.编写一个add.h声明函数add

root@7519ef034539:/home/gaole/Cprogram/myc# cat add.h
int add(int, int);

3.编写一个主函数调用add函数,保存在文件main.c中


root@7519ef034539:/home/gaole/Cprogram/myc# cat main.c
#include <stdio.h>
#include "add.h"

int main(void) {
    int sum,x,y;
    x = 3;
    y = 4;

    sum = add(3, 4);
    printf("%d\n",sum);

    return 0;
}

实战一

1.直接编译main.c生成main.o ,在用main.o生成main, 测试结果:

#执行gcc -c main.c可以不报错的生成main.o

#但是再执行gcc main.o -o main的时候,提示找不到add的定义

root@7519ef034539:/home/gaole/Cprogram/myc# gcc -c main.c
root@7519ef034539:/home/gaole/Cprogram/myc# ls
add.c  add.o   chap02  chap04  chap06  chap08  chap10  chap12  main.c  mychap14  q2.h  sort.c  test.h
add.h  chap01  chap03  chap05  chap07  chap09  chap11  chap13  main.o  q2.c      sort  sort.o
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# gcc main.o -o main
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x21): undefined reference to `add'
collect2: error: ld returned 1 exit status

解决方法:

方法一:将描述这个函数的源文件编译成.o文件,一起和main.o链接

把定义add函数的,add.c源文件编译成add.o

然后在执行gcc main.o add.o -o main

root@7519ef034539:/home/gaole/Cprogram/myc# gcc -c add.c
root@7519ef034539:/home/gaole/Cprogram/myc# ls
add.c  add.o   chap02  chap04  chap06  chap08  chap10  chap12  main.c  mychap14  q2.h  sort.c  test.h
add.h  chap01  chap03  chap05  chap07  chap09  chap11  chap13  main.o  q2.c      sort  sort.o
root@7519ef034539:/home/gaole/Cprogram/myc# gcc main.o add.o -o main
root@7519ef034539:/home/gaole/Cprogram/myc# ./main
7
root@7519ef034539:/home/gaole/Cprogram/myc# 

方法二:把add.c编译成动态链接库,然后与main.o链接生成main

第一步:生成一个动态库,libxxxx.so
root@7519ef034539:/home/gaole/Cprogram/myc# gcc -fPIC -shared -o libadd.so add.c
root@7519ef034539:/home/gaole/Cprogram/myc# ls
add.c  chap01  chap03  chap05  chap07  chap09  chap11  chap13     main.c    mychap14  q2.h  sort.c  test.h
add.h  chap02  chap04  chap06  chap08  chap10  chap12  libadd.so  makefile  q2.c      sort  sort.o
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 

第二步:把main.c编译成main.o
root@7519ef034539:/home/gaole/Cprogram/myc# gcc -c main.c 
root@7519ef034539:/home/gaole/Cprogram/myc# ls
add.c  chap01  chap03  chap05  chap07  chap09  chap11  chap13     main.c  makefile  q2.c  sort    sort.o
add.h  chap02  chap04  chap06  chap08  chap10  chap12  libadd.so  main.o  mychap14  q2.h  sort.c  test.h
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 


第三步:把main.o和libadd.so一起链接,但是这里没有找到libadd.so
root@7519ef034539:/home/gaole/Cprogram/myc# gcc main.o -ladd -o main
/usr/bin/ld: cannot find -ladd
collect2: error: ld returned 1 exit status

第四步:因为默认是到/usr/lib中去找,所以这里要自定义一个路径,添加-L参数
root@7519ef034539:/home/gaole/Cprogram/myc# gcc main.o -L../myc -ladd -o main

第五步:执行main,但是找不到libadd.so
root@7519ef034539:/home/gaole/Cprogram/myc# ./main
./main: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 

第六步:添加变量LD_LIBRARY_PATH,export成环境变量,在执行,就能找到这个libadd.so了。
root@7519ef034539:/home/gaole/Cprogram/myc# pwd             
/home/gaole/Cprogram/myc
root@7519ef034539:/home/gaole/Cprogram/myc# #LD_LIBRARY_PATH=
root@7519ef034539:/home/gaole/Cprogram/myc# #
root@7519ef034539:/home/gaole/Cprogram/myc# LD_LIBRARY_PATH=../myc
root@7519ef034539:/home/gaole/Cprogram/myc# ./main           
./main: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
root@7519ef034539:/home/gaole/Cprogram/myc# export LD_LIBRARY_PATH
root@7519ef034539:/home/gaole/Cprogram/myc# ./main
7
root@7519ef034539:/home/gaole/Cprogram/myc# 

方法三:把add.c编译成静态链接库,然后与main.o链接生成main

第一步:现将add.c编译成一个add.o
root@7519ef034539:/home/gaole/Cprogram/myc# gcc -c add.c 
root@7519ef034539:/home/gaole/Cprogram/myc# ls
add.c  add.o   chap02  chap04  chap06  chap08  chap10  chap12  main.c  makefile  q2.c  sort    sort.o
add.h  chap01  chap03  chap05  chap07  chap09  chap11  chap13  main.o  mychap14  q2.h  sort.c  test.h
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 
root@7519ef034539:/home/gaole/Cprogram/myc# 

第二步:生成libadd.a
root@7519ef034539:/home/gaole/Cprogram/myc# ar -cvr libadd.a add.o
a - add.o
root@7519ef034539:/home/gaole/Cprogram/myc# ls
add.c  add.o   chap02  chap04  chap06  chap08  chap10  chap12  libadd.a  main.o    mychap14  q2.h  sort.c  test.h
add.h  chap01  chap03  chap05  chap07  chap09  chap11  chap13  main.c    makefile  q2.c      sort  sort.o

第三步:把main.o和libadd.a链接成main
root@7519ef034539:/home/gaole/Cprogram/myc# gcc main.o -L../myc -ladd -o main

第四步:不需要添加LD_LIBRARY_PATH,直接运行
root@7519ef034539:/home/gaole/Cprogram/myc# ./main
7
root@7519ef034539:/home/gaole/Cprogram/myc# 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值