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