1:ADD_LIBRARY()语法
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
<name>
:库的名字,直接写名字即可,不要写lib,会自动加上前缀的哈。[STATIC | SHARED | MODULE]
:类型有三种。
SHARED,动态库
STATIC,静态库
MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
EXCLUDE_FROM_ALL
:这个库不会被默认构建,除非有其他的组件依赖或者手
工构建。
使用
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) #共享库
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) #静态库
注意,因为默认规则是不能有相同名字的共享库(so)与静态库(a),所以当生成静态库的时候,共享库会被删除,因为只能允许一个名字存在,相同名字的会被替代(hello),所以需要通过SET_TARGET_PROPERTIES()来解决这个问题,例子:
解决方法:改libhello_static.a的属性–输出名字
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
这样就可以生成libhello.so与libhello.a了
cmake在构建一个target的时候,会删除之前生成的target,一样是通过设置SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目的
动态库的版本号:
同样是通过SET_TARGET_PROPERTIES()来设置
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
VERSION:动态库版本
SOVERSION:API版本
最后生成的结果是:
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so->libhello.so.1
安装:
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(TARGETS hello.h
DESTINATION include/hello)
其他常用的属性 PERMISSIONS:设置权限;RATTERN:设置正则表达式
Summary:
ADD_LIBRARY():添加一个库,共享库,静态库,模块
SET_TARGET_PROPERTIES():设置输出名称,版本号,解决相同target被删除的问题
GET_TARGET_PROEERTIES():与SET功能相对
(2)add_executable 生成可执行文件,用法和上面差不多