linux下文件的类型是不依赖于其后缀名的,但一般来讲:
.o,是目标文件,相当于windows中的.obj文件
.so为共享库,是shared object,用于动态连接的,和dll差不多
.a为静态库,是好多个.o合在一起,用于静态连接
创建静态库:
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -c hello.c /*生成.o的目标文件*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o main.c
root@ubuntu:/home/wangyiyf2/test/libtest# ar -cr libhello.a hello.o /*使用目标文件生成libhello.a的静态库*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o libhello.a main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc main.c -o main -L. -lhello /*编译的时候加上libxxx.a的静态库*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o libhello.a main main.c
root@ubuntu:/home/wangyiyf2/test/libtest# ./main /*可以运行成功*/
hello world
root@ubuntu:/home/wangyiyf2/test/libtest# rm libhello.a /*删掉libhello.a的静态库也可以运行*/
root@ubuntu:/home/wangyiyf2/test/libtest# ./main
hello world
注1:-cr:-c表示create,-r表示replace
注2:-L.表示lib,"."表示静态库在本目录下寻找。
创建动态库:
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -c -fPIC hello.c /*产生.o的目标文件*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -shared -fPIC hello.o -o libhello.so /*用目标文件生成.so的共享库*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o libhello.so main.c
root@ubuntu:/home/wangyiyf2/test/libtest# cp libhello.so /lib /*把共享库复制到/lib 或/usr/lib目录下*/
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -o main main.c -L. -lhello /*编译main函数,要包含共享库libxxx.so*/
root@ubuntu:/home/wangyiyf2/test/libtest# ./main /*运行成功*/
hello world
root@ubuntu:/home/wangyiyf2/test/libtest# ./main /*删掉/lib下的目标共享库的话运行失败*/
./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
注3:-L. -lhello :-l表示lib,hello是libhello.so的缩写,代表libhello.so libxxx.so
.o,是目标文件,相当于windows中的.obj文件
.so为共享库,是shared object,用于动态连接的,和dll差不多
.a为静态库,是好多个.o合在一起,用于静态连接
创建静态库:
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -c hello.c /*生成.o的目标文件*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o main.c
root@ubuntu:/home/wangyiyf2/test/libtest# ar -cr libhello.a hello.o /*使用目标文件生成libhello.a的静态库*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o libhello.a main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc main.c -o main -L. -lhello /*编译的时候加上libxxx.a的静态库*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o libhello.a main main.c
root@ubuntu:/home/wangyiyf2/test/libtest# ./main /*可以运行成功*/
hello world
root@ubuntu:/home/wangyiyf2/test/libtest# rm libhello.a /*删掉libhello.a的静态库也可以运行*/
root@ubuntu:/home/wangyiyf2/test/libtest# ./main
hello world
注1:-cr:-c表示create,-r表示replace
注2:-L.表示lib,"."表示静态库在本目录下寻找。
创建动态库:
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -c -fPIC hello.c /*产生.o的目标文件*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o main.c
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -shared -fPIC hello.o -o libhello.so /*用目标文件生成.so的共享库*/
root@ubuntu:/home/wangyiyf2/test/libtest# ls
hello.c hello.h hello.o libhello.so main.c
root@ubuntu:/home/wangyiyf2/test/libtest# cp libhello.so /lib /*把共享库复制到/lib 或/usr/lib目录下*/
root@ubuntu:/home/wangyiyf2/test/libtest# gcc -o main main.c -L. -lhello /*编译main函数,要包含共享库libxxx.so*/
root@ubuntu:/home/wangyiyf2/test/libtest# ./main /*运行成功*/
hello world
root@ubuntu:/home/wangyiyf2/test/libtest# ./main /*删掉/lib下的目标共享库的话运行失败*/
./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
注3:-L. -lhello :-l表示lib,hello是libhello.so的缩写,代表libhello.so libxxx.so