linux创建动态库

静态库的创建和使用:

- 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]# 

你可能感兴趣的:(linux-c/c++)