通常使用makefile编译,不是很关注so的版本号。但是最近公司的部分核心代码开源,切换成CMake编译时,就涉及到这一点。
设置cmake的编译目标
SET_TARGET_PROPERTIES(taos PROPERTIES VERSION 1.6.0.0 SOVERSION 1)
此时,会生成三个文件
libtaos.so -> libtaos.so.1*
libtaos.so.1 -> libtaos.so.1.6.0.0*
libtaos.so.1.6.0.0
其中,libtaos.so.1.6.0.0为动态库的文件名(realname),libtaos.so.1为动态库的别名(soname),libtaos.so为动态库的链接名(linkname)。
在makefile中-ltaos时,makefile会寻找libtaos.so,然后将libtaos.so.1写入到可执行文件的链接信息中,makefile类似这样
LFLAGS = '-Wl,-rpath,/usr/local/lib/taos/' -ltaos -lpthread -lm -lrt
编译之后的可执行文件,其链接库如下
ubuntu@ubuntu:~/work/op/tests/examples/c$ ldd demo
linux-vdso.so.1 => (0x00007ffe3c8b1000)
libtaos.so.1 => /usr/local/lib/taos/libtaos.so.1 (0x00007f0bd4d3c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bd495b000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0bd473e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0bd4434000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0bd422c000)
/lib64/ld-linux-x86-64.so.2 (0x000055868fbdf000)
这样,当动态库版本升级到libtaos.so.1.6.0.1时,已经编译好的可执行文件会自动寻找libtaos.so.1,最后使用libtaos.so.1.6.0.1。
当然,您还可能需要在编译时自动生成版本号,那么就可以使用cmake的变量来完成,参考如下代码
execute_process(COMMAND get_version.sh OUTPUT_VARIABLE VERSION_INFO)
MESSAGE(STATUS "${VERSION_INFO}")
SET_TARGET_PROPERTIES(taos PROPERTIES VERSION ${VERSION_INFO} SOVERSION 1)