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#