静态库的创建和使用:
- g++ add.cpp生成add.o目标文件
- ar cqs libadd.a add.o
- ar打包目标文件(elf中的relocatable文件)
- 静态库的名字lib[static_library_name].a
- 链接静态库.
- g++ main.c -L . -ladd
- 静态库的链接语法和动态库基本语法一致.
动态库的创建和使用:
- g++ -fPIC -shaerd add.cpp -o libadd.so
- shared library的名字格式:lib[name].so
- 动态库的使用.
- g++ main.c -L . -ladd
- 记得增加链接搜索路径。
- error常见解析:
- cannot find -ladd
- 出现这种错误是因为在编译链接动态库的时候找不到该动态库,即没有指定编译时的搜索路劲
- 解决方案见<动态库的链接>
[root@VM_0_9_centos dynamic_lib_text]# ls
add.c add.h add.o libadd.so main.c
[root@VM_0_9_centos dynamic_lib_text]# g++ main.c
/tmp/ccBAOjnr.o: In function `main':
main.c:(.text+0x13): undefined reference to `add(int, int)'
collect2: error: ld returned 1 exit status
[root@VM_0_9_centos dynamic_lib_text]#
- undefined reference to `add(int, int)'
- 编译时通过 -l指定了动态库,但是没有搜索路径。
[root@VM_0_9_centos dynamic_lib_text]# ls
add.c add.h add.o libadd.so main.c
[root@VM_0_9_centos dynamic_lib_text]# g++ main.c -ladd
/usr/bin/ld: cannot find -ladd
collect2: error: ld returned 1 exit status
[root@VM_0_9_centos dynamic_lib_text]#
- error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
- 运行时找不到链接动态库的路径。
[root@VM_0_9_centos dynamic_lib_text]# ls
add.c add.h add.o libadd.so main.c
[root@VM_0_9_centos dynamic_lib_text]# g++ main.c -ladd -L .
[root@VM_0_9_centos dynamic_lib_text]# ./a.out
./a.out: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
[root@VM_0_9_centos dynamic_lib_text]#
- 简单解决方案:
- g++ main.c -L . -ladd
- export LD_LIBRARY_PATH=.
[root@VM_0_9_centos dynamic_lib_text]# ls
add.c add.h add.o a.out libadd.so main.c
[root@VM_0_9_centos dynamic_lib_text]# g++ main.c -ladd -L .
[root@VM_0_9_centos dynamic_lib_text]# ./a.out
./a.out: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
[root@VM_0_9_centos dynamic_lib_text]# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
[root@VM_0_9_centos dynamic_lib_text]# ./a.out
use dynamic library. iret=39
[root@VM_0_9_centos dynamic_lib_text]#