1.首先介绍下依赖关系:
sub.c 依赖于 common.c
add.c 依赖于 common.c
main.c 以来与 sub.c add.c
2.编译一个math.a main.c依赖于math.a
说明: 可以使用-lmath 或者 libmath.a 都是可以的.
第一种方式:
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ gcc -c *.c -I ./include/
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ar -rcs libmath.a *.o
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ gcc main.c -o main.out -L ./ -lmath -I ./include/
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ./main.out
Hello, World!
执行common-------->function
执行add-------->function
执行common-------->function
执行sub-------->function
第二种方式:
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ gcc -c *.c -I ./include/
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ar -rcs libmath.a *.o
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ gcc main.c -o main.out -L ./ libmath.a -I ./include/
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ./main.out
Hello, World!
执行common-------->function
执行add-------->function
执行common-------->function
执行sub-------->function
3.各自编译add sub common,add 和sub 依赖于 common
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ gcc -c *.c -I ./include/
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ar -rcs libadd.a add.o
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ar -rcs libsub.a sub.o
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ar -rcs libcommon.a common.o
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ gcc main.c -o main.out -static -L ./ -ladd -lsub -lcommon -I ./include/
yueqingchan@yueqingChan:~/Desktop/TestGcc-Files/TestStatic1$ ./main.out
Hello, World!
执行common-------->function
执行add-------->function
执行common-------->function
执行sub-------->function
说明: 静态库就算存在以来关系也是可以直接编译的. 但是最后的时候需要-l (小写的L)所有的静态库.
4.add.a sub.a common.a 生成一个动态库(待验证)
$ gcc -shared -fPIC -Wl,--whole-archive libA.a libB.a libC.a -Wl,--no-whole-archive -Wl,-soname -o libcombined.so