现在有一个库工程,源码目录如下:

其编译脚本CMakelist.txt内容如下:
cmake_minimum_required(VERSION 3.5)
project(xylib C)
#add_library(xylib SHARED xyapicore.c)
add_library(xylib SHARED xyapicore.c xylib1.c xylib2.c xylib3.c)
set_target_properties(xylib PROPERTIES VERSION 1.2 SOVERSION 1)
include(GNUInstallDirs)
install(TARGETS xylib
RUNTIME DESTINATION bin
LIBRARY OPTIONAL NAMELINK_SKIP DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libg COMPONENT RUNTIME
ARCHIVE DESTINATION libstatic
)
从脚本中可以看出,是编译出一个动态链接库, 名字为xylib
set_target_properties命令设置了该动态链接库的soname为1.2, soversion为1.
install指令是安装指令。
LIBRARY OPTIONAL NAMELINK_SKIP DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libg COMPONENT RUNTIME
1.动态链接库的版本号管理和链接
这个参数是指定共享库的目录放在默认路径的lib目录下。 NAMELINK_SKIP 是跳过soname链接。
编译后的文件结构如下:

如果改用 NAMELINK_ONLY参数呢:
删除xypack安装目录。并修改共享库的安装路径:
LIBRARY OPTIONAL NAMELINK_ONLY DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libg COMPONENT RUNTIME

得到的结果如下:

如果默认的情况呢:
LIBRARY DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libg COMPONENT RUNTIME
更新之后如图:

总结:
名称 | 产生SONAME吗 | 产生SOVERSION吗 | 产生SO文件吗 |
---|---|---|---|
defalut | Y | Y | Y |
NAMELINK_SKIP | Y | Y | N |
NAMELINK_ONLY | N | N | Y |
2. 动态链接库的分配置安装
在cmake的install指令中大都有CONFIGURATIONS参数。如下修改后的文件
cmake_minimum_required(VERSION 3.5)
project(xylib C)
#add_library(xylib SHARED xyapicore.c)
add_library(xylib SHARED xyapicore.c xylib1.c xylib2.c xylib3.c)
set_target_properties(xylib PROPERTIES VERSION 1.2 SOVERSION 1)
include(GNUInstallDirs)
install(TARGETS xylib
CONFIGURATIONS DEBUG
RUNTIME DESTINATION bin
LIBRARY DESTINATION debug/${CMAKE_INSTALL_INCLUDEDIR}/libg COMPONENT RUNTIME
ARCHIVE DESTINATION libstatic
)
install(TARGETS xylib
CONFIGURATIONS RELEASE
RUNTIME DESTINATION bin
LIBRARY DESTINATION release/${CMAKE_INSTALL_INCLUDEDIR}/libg COMPONENT RUNTIME
ARCHIVE DESTINATION libstatic
)
我们配置了debug和release两种配置。并把生成的so库文件放到不同的目录上。
我们使用ccmake进行编译环境设置:
mkdir build && cd build
ccmake ../
修改CMAKE_BUILD_TYPE 编译类型为 DEBUG, 并修改 CMAKE_INSTALL_PREFIX 安装目录前缀为xypack. 然后按c,再输入g来生成配置缓存CMakeCache.txt。


现在来编译:
make && make install

现在再运行
ccmake ../
修改 CMAKE_BUILD_TYPE 为 RELEASE,并更新配置文件

可见安装的目录到了release目录下

网友评论