动态链接库一般以lib开头,形如libmymodule.so.1.0.0.
后面跟的三个版本号,从左到右的含义为:
(1) 大版本号,当接口变得和之前不兼容,则新增一个大版本号。
(2) 一般增加了接口,不过旧的接口不变,则新增此版本号。
(3) 接口不做任何变化,只是实现做了修改,则新增此版本号。
假设我们的库只包含 module.cpp, 则用命令
g++ -fPIC -Wall -c module.cpp
生成module.o,再用命令
g++ -shared -Wl,-soname,libmymodule.so.1 -o libmymodule.so.1.0.0 module.o
生成libmymodule.so.1.0.0共享库。这里的libmymodule.so.1.0.0也叫做共享库的real name.
-fPIC是使生成的目标文件“位置无关(Position Independent Code)”从而可以被多个程序共享。
-shared 指定产生共享库。
-Wl,-soname,libmymodule.so.1 指定共享库的soname为libmymodule.so.1,若不指定,则无soname. soname的作用后面会提到。可以用objdump -p libmymodule.so.1.0.0 | grep SONAME 查看soname.
一般soname带且只带大版本号,比如这里的libmymodule.so.1, 是因为共享库的相互兼容的不同版本,都具有相同的soname(在升级的时候,需要用soname来对应)。而如果大版本号变了,意味着接口变得不兼容了,也就