CMake中动态库的版本号

通常使用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)

你可能感兴趣的:(开发工具)